From 789e4cbb1a992d7b64c15c2f70d5942dd291d42d Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Thu, 17 Oct 2019 23:15:37 +0800 Subject: [PATCH 01/39] =?UTF-8?q?spring=20boot=E5=8D=87=E7=BA=A7=E5=88=B02?= =?UTF-8?q?.1.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- len-web/pom.xml | 6 +++--- .../com/len/{Application.java => LenApplication.java} | 11 ++++------- len-web/src/main/java/test/ActivitiDemo.java | 11 +++-------- len-web/src/main/java/test/ActivitiGateWay.java | 4 ++-- len-web/src/main/java/test/ActivitiVariable.java | 4 ++-- len-web/src/main/java/test/BlogTest.java | 4 ++-- len-web/src/main/java/test/BootTest.java | 4 ++-- len-web/src/main/resources/application-mysql-dev.yml | 2 ++ pom.xml | 4 ++-- 10 files changed, 23 insertions(+), 29 deletions(-) rename len-web/src/main/java/com/len/{Application.java => LenApplication.java} (73%) diff --git a/README.md b/README.md index 621b66e..c328f07 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ java -jar len-web.jar ## 技术 * jdk:1.8 -* 核心框架:spring boot 2.0.1.RELEASE +* 核心框架:spring boot 2.1.9.RELEASE * 安全框架:Apache Shiro * 工作流引擎:Activiti * 数据库连接池:druid diff --git a/len-web/pom.xml b/len-web/pom.xml index 84f7d25..629c577 100644 --- a/len-web/pom.xml +++ b/len-web/pom.xml @@ -32,12 +32,12 @@ de.codecentric spring-boot-admin-starter-client - 2.0.1 + 2.1.6 org.springframework.cloud spring-cloud-starter-netflix-eureka-client - 2.0.1.RELEASE + 2.1.3.RELEASE @@ -68,7 +68,7 @@ spring-boot-maven-plugin true - com.len.Application + com.len.LenApplication ZIP diff --git a/len-web/src/main/java/com/len/Application.java b/len-web/src/main/java/com/len/LenApplication.java similarity index 73% rename from len-web/src/main/java/com/len/Application.java rename to len-web/src/main/java/com/len/LenApplication.java index 43b9955..16117ad 100644 --- a/len-web/src/main/java/com/len/Application.java +++ b/len-web/src/main/java/com/len/LenApplication.java @@ -4,7 +4,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -23,15 +22,13 @@ import tk.mybatis.spring.annotation.MapperScan; @MapperScan(basePackages = {"com.len.mapper"}) @EnableDiscoveryClient @EnableAutoConfiguration(exclude = { - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, + org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class }) -public class Application { +public class LenApplication { public static void main(String[] args) { - ApplicationContext applicationContext = SpringApplication.run(Application.class, args); -// String[] names = applicationContext.getBeanDefinitionNames(); - //1.8 forEach循环 -// Arrays.asList(names).forEach(System.out::println); + SpringApplication.run(LenApplication.class, args); System.out.println("Server start succ"); } diff --git a/len-web/src/main/java/test/ActivitiDemo.java b/len-web/src/main/java/test/ActivitiDemo.java index b704fd8..49b7742 100644 --- a/len-web/src/main/java/test/ActivitiDemo.java +++ b/len-web/src/main/java/test/ActivitiDemo.java @@ -1,11 +1,9 @@ package test; -import com.len.Application; -import java.io.FileNotFoundException; +import com.len.LenApplication; + import java.io.FileOutputStream; -import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -17,14 +15,11 @@ import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; -import org.activiti.engine.history.HistoricActivityInstance; -import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; -import org.activiti.engine.impl.pvm.PvmTransition; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; @@ -48,7 +43,7 @@ import org.springframework.test.context.web.WebAppConfiguration; * 本demo 根据官网doc教程 address:http://www.mossle.com/docs/activiti/index.html */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = LenApplication.class) @WebAppConfiguration public class ActivitiDemo { diff --git a/len-web/src/main/java/test/ActivitiGateWay.java b/len-web/src/main/java/test/ActivitiGateWay.java index 323783e..308791d 100644 --- a/len-web/src/main/java/test/ActivitiGateWay.java +++ b/len-web/src/main/java/test/ActivitiGateWay.java @@ -1,6 +1,6 @@ package test; -import com.len.Application; +import com.len.LenApplication; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; @@ -31,7 +31,7 @@ import org.springframework.test.context.web.WebAppConfiguration; * 网关 */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = LenApplication.class) @WebAppConfiguration public class ActivitiGateWay { diff --git a/len-web/src/main/java/test/ActivitiVariable.java b/len-web/src/main/java/test/ActivitiVariable.java index 0e89ef6..544bc5d 100644 --- a/len-web/src/main/java/test/ActivitiVariable.java +++ b/len-web/src/main/java/test/ActivitiVariable.java @@ -1,6 +1,6 @@ package test; -import com.len.Application; +import com.len.LenApplication; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -27,7 +27,7 @@ import org.springframework.test.context.web.WebAppConfiguration; * @email 154040976@qq.com */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = LenApplication.class) @WebAppConfiguration public class ActivitiVariable { diff --git a/len-web/src/main/java/test/BlogTest.java b/len-web/src/main/java/test/BlogTest.java index 3773c81..73e8a26 100644 --- a/len-web/src/main/java/test/BlogTest.java +++ b/len-web/src/main/java/test/BlogTest.java @@ -1,6 +1,6 @@ package test; -import com.len.Application; +import com.len.LenApplication; import com.len.entity.BlogCategory; import com.len.service.ArticleCategoryService; import com.len.service.BlogCategoryService; @@ -24,7 +24,7 @@ import java.util.UUID; * @email 154040976@qq.com */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = LenApplication.class) @WebAppConfiguration public class BlogTest { diff --git a/len-web/src/main/java/test/BootTest.java b/len-web/src/main/java/test/BootTest.java index 9f178f3..71b130f 100644 --- a/len-web/src/main/java/test/BootTest.java +++ b/len-web/src/main/java/test/BootTest.java @@ -1,6 +1,6 @@ package test; -import com.len.Application; +import com.len.LenApplication; import com.len.entity.SysUser; import com.len.redis.RedisService; import com.len.service.SysUserService; @@ -17,7 +17,7 @@ import org.springframework.test.context.web.WebAppConfiguration; * @email 154040976@qq.com */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = Application.class) +@SpringBootTest(classes = LenApplication.class) @WebAppConfiguration public class BootTest { diff --git a/len-web/src/main/resources/application-mysql-dev.yml b/len-web/src/main/resources/application-mysql-dev.yml index 6803a39..6297b2f 100644 --- a/len-web/src/main/resources/application-mysql-dev.yml +++ b/len-web/src/main/resources/application-mysql-dev.yml @@ -1,6 +1,8 @@ server: port: 8081 spring: + main: + allow-bean-definition-overriding: true devtools: restart: enabled: true diff --git a/pom.xml b/pom.xml index d2c855b..12807c4 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.1.RELEASE + 2.1.9.RELEASE @@ -93,7 +93,7 @@ org.springframework.boot spring-boot-starter-data-redis - 2.0.1.RELEASE + 2.1.9.RELEASE -- Gitee From 010a180a2705aac4022031b5018e7e097b5c8066 Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Thu, 17 Oct 2019 23:52:54 +0800 Subject: [PATCH 02/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=B1=A0=E4=B8=BAspring=20boot=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4HikariCP=20=E8=BF=9E=E6=8E=A5=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/len/config/DruidConfig.java | 6 ++- .../main/java/com/len/config/ShiroConfig.java | 5 +- .../main/resources/application-mysql-dev.yml | 51 +++++++++++++------ pom.xml | 4 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/len-web/src/main/java/com/len/config/DruidConfig.java b/len-web/src/main/java/com/len/config/DruidConfig.java index 5682178..e984ceb 100644 --- a/len-web/src/main/java/com/len/config/DruidConfig.java +++ b/len-web/src/main/java/com/len/config/DruidConfig.java @@ -1,3 +1,4 @@ +/* package com.len.config; import com.alibaba.druid.pool.DruidDataSource; @@ -20,11 +21,13 @@ import java.sql.SQLException; import java.util.HashMap; import java.util.Map; +*/ /** * @author zhuxiaomeng * @date 2018/1/2. * @email 154040976@qq.com - */ + *//* + @Configuration @EnableTransactionManagement public class DruidConfig { @@ -104,3 +107,4 @@ public class DruidConfig { } } +*/ diff --git a/len-web/src/main/java/com/len/config/ShiroConfig.java b/len-web/src/main/java/com/len/config/ShiroConfig.java index b34d33a..16d273f 100644 --- a/len-web/src/main/java/com/len/config/ShiroConfig.java +++ b/len-web/src/main/java/com/len/config/ShiroConfig.java @@ -17,8 +17,10 @@ import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.DelegatingFilterProxy; import javax.servlet.Filter; import java.util.*; @@ -175,7 +177,6 @@ public class ShiroConfig { defaultWebSessionManager.setSessionIdUrlRewritingEnabled(false); return defaultWebSessionManager; } -/* @Bean public FilterRegistrationBean delegatingFilterProxy(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); @@ -185,7 +186,7 @@ public class ShiroConfig { filterRegistrationBean.setFilter(proxy); return filterRegistrationBean; - }*/ + } } diff --git a/len-web/src/main/resources/application-mysql-dev.yml b/len-web/src/main/resources/application-mysql-dev.yml index 6297b2f..52bb3a7 100644 --- a/len-web/src/main/resources/application-mysql-dev.yml +++ b/len-web/src/main/resources/application-mysql-dev.yml @@ -10,25 +10,45 @@ spring: url: jdbc:mysql://localhost:3306/lenos?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 - # 使用druid数据源 - type: com.alibaba.druid.pool.DruidDataSource + # 推荐使用HikariCP数据源 + type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver - filters: stat - maxActive: 20 - initialSize: 1 - maxWait: 60000 - minIdle: 1 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - validationQuery: select 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - poolPreparedStatements: true - maxOpenPreparedStatements: 20 + sqlScriptEncoding: UTF-8 + hikari: + minimum-idle: 5 + maximum-pool-size: 15 + auto-commit: true + idle-timeout: 30000 + pool-name: DatebookHikariCP + max-lifetime: 1800000 + connection-timeout: 30000 + connection-test-query: SELECT 1 + +# 如果你喜欢druid 可以放开pom注释 DruidConfig 注释 使用此数据源 +# datasource: +# url: jdbc:mysql://localhost:3306/lenos?useUnicode=true&characterEncoding=UTF-8 +# username: root +# password: 123456 +# # 使用druid数据源 +# type: com.alibaba.druid.pool.DruidDataSource +# driver-class-name: com.mysql.jdbc.Driver +# filters: stat +# maxActive: 20 +# initialSize: 1 +# maxWait: 60000 +# minIdle: 1 +# timeBetweenEvictionRunsMillis: 60000 +# minEvictableIdleTimeMillis: 300000 +# validationQuery: select 'x' +# testWhileIdle: true +# testOnBorrow: false +# testOnReturn: false +# poolPreparedStatements: true +# maxOpenPreparedStatements: 20 http: encoding: force: true +# 需要启动admin模块 来监听 boot: admin: client: @@ -47,6 +67,7 @@ eureka: client: fetch-registry: false register-with-eureka: false +# 博客用到redis redis: host: 127.0.0.1 port: 6379 diff --git a/pom.xml b/pom.xml index 12807c4..fce4e27 100644 --- a/pom.xml +++ b/pom.xml @@ -116,11 +116,11 @@ - + -- Gitee From df401ca7bf12167a7b8c44fa7fee64694be51142 Mon Sep 17 00:00:00 2001 From: art <779663952@qq.com> Date: Thu, 24 Oct 2019 09:53:40 +0800 Subject: [PATCH 03/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- len-sys/src/main/resources/plugin/x-admin/css/xadmin.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/len-sys/src/main/resources/plugin/x-admin/css/xadmin.css b/len-sys/src/main/resources/plugin/x-admin/css/xadmin.css index a35c1db..393ba06 100644 --- a/len-sys/src/main/resources/plugin/x-admin/css/xadmin.css +++ b/len-sys/src/main/resources/plugin/x-admin/css/xadmin.css @@ -102,7 +102,7 @@ body{ width:100%; } .login hr { - background: #fff url() 0 0 no-repeat; + background: #fff 0 0 no-repeat; } .login hr.hr15 { height: 15px; @@ -165,7 +165,7 @@ xblock{ } .page a{ display: inline-block; - background: #fff url() 0 0 no-repeat; + background: #fff 0 0 no-repeat; color: #888; padding: 10px; min-width: 15px; -- Gitee From edf40286ff5a6c71eb0da89b89c917c70283cb6e Mon Sep 17 00:00:00 2001 From: art <779663952@qq.com> Date: Thu, 24 Oct 2019 10:00:54 +0800 Subject: [PATCH 04/39] socket --- .../java/com/len/socket/WebSocketService.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 len-core/src/main/java/com/len/socket/WebSocketService.java diff --git a/len-core/src/main/java/com/len/socket/WebSocketService.java b/len-core/src/main/java/com/len/socket/WebSocketService.java new file mode 100644 index 0000000..b7777fc --- /dev/null +++ b/len-core/src/main/java/com/len/socket/WebSocketService.java @@ -0,0 +1,81 @@ +package com.len.socket; + +import com.len.util.LenResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + + +@Slf4j +@Component +@ServerEndpoint(value = "/webSocket/{userId}") +public class WebSocketService { + + private static ConcurrentHashMap socketClient = new ConcurrentHashMap<>(); + + private Session session; + + public static ConcurrentHashMap getClients() { + return socketClient; + } + + @OnOpen + public void onOpen(@PathParam("userId") String userId, Session session) { + this.session = session; + socketClient.put(userId, this); + log.info("【websocket消息】有新的连接, 总数:{}", socketClient.size()); + } + + @OnClose + public void onClose(Session session) { + socketClient.remove(session.getId()); + log.info("【websocket消息】连接断开, 总数:{}", socketClient.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("【websocket消息】收到客户端发来的消息:{}", message); + } + + /** + * 推消息给个人 + * + * @param response + * @param userId + * @throws IOException + */ + public void sendMessage(LenResponse response, String userId) throws IOException { + WebSocketService webSocketService = socketClient.get(userId); + if (webSocketService != null) { + try { + webSocketService.session.getBasicRemote().sendObject(response); + } catch (EncodeException e) { + e.printStackTrace(); + } + } + } + + /** + * 广播消息 + * + * @param response + */ + public void sendMessageBroad(LenResponse response) { + for (Entry webSocket : socketClient.entrySet()) { + log.info("【websocket消息】广播消息, message={}", response); + try { + webSocket.getValue().session.getBasicRemote().sendObject(response); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + +} -- Gitee From 5f137656f8f25cff77f4f9cb80a8e14d24b071a7 Mon Sep 17 00:00:00 2001 From: art <779663952@qq.com> Date: Thu, 24 Oct 2019 10:07:20 +0800 Subject: [PATCH 05/39] js --- len-sys/src/main/resources/plugin/layui/lay/modules/util.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/len-sys/src/main/resources/plugin/layui/lay/modules/util.js b/len-sys/src/main/resources/plugin/layui/lay/modules/util.js index f5eb45b..256f47a 100644 --- a/len-sys/src/main/resources/plugin/layui/lay/modules/util.js +++ b/len-sys/src/main/resources/plugin/layui/lay/modules/util.js @@ -1,2 +1,2 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,o,a="layui-fixbar",r="layui-fixbar-top",n=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
    ',e.bar1?'
  • '+c[0]+"
  • ":"",e.bar2?'
  • '+c[1]+"
  • ":"",'
  • '+c[2]+"
  • ","
"].join("")),s=g.find("."+r),u=function(){var t=n.scrollTop();t>=e.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&g.css(e.css),l.append(g),u(),g.find("li").on("click",function(){var i=t(this),o=i.attr("lay-type");"top"===o&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,o)}),n.on("scroll",function(){clearTimeout(o),o=setTimeout(function(){u()},100)}))},countdown:function(e,t,i){var o=this,a="function"==typeof t,r=new Date(e).getTime(),n=new Date(!t||a?(new Date).getTime():t).getTime(),l=r-n,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var g=setTimeout(function(){o.countdown(e,n+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,o=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>6912e5?(a=new Date(e),o[0][0]=i.digit(a.getFullYear(),4),o[0][1]=i.digit(a.getMonth()+1),o[0][2]=i.digit(a.getDate()),t||(o[1][0]=i.digit(a.getHours()),o[1][1]=i.digit(a.getMinutes()),o[1][2]=i.digit(a.getSeconds())),o[0].join("-")+" "+o[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var o=e.length;o',t.bar1?'
  • '+c[0]+"
  • ":"",t.bar2?'
  • '+c[1]+"
  • ":"",'
  • '+c[2]+"
  • ",""].join("")),s=g.find("."+o),u=function(){var e=r.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+a)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),n=i.attr("lay-type");"top"===n&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var n=this,a="function"==typeof e,o=new Date(t).getTime(),r=new Date(!e||a?(new Date).getTime():e).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=e);var g=setTimeout(function(){n.countdown(t,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(t).getTime();return a>6912e5?(a=new Date(t),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),e||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var n=t.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(t,n,a){n=i.event[t]=e.extend(!0,i.event[t],n)||{},e("body").on(a||"click","*["+t+"]",function(){var i=e(this),a=i.attr(t);n[a]&&n[a].call(this,i)})}};!function(t,e,i){"$:nomunge";function n(){a=e[l](function(){o.each(function(){var e=t(this),i=e.width(),n=e.height(),a=t.data(this,g);(i!==a.w||n!==a.h)&&e.trigger(c,[a.w=i,a.h=n])}),n()},r[s])}var a,o=t([]),r=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";r[s]=250,r[u]=!0,t.event.special[c]={setup:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===o.length&&n()},teardown:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.not(e),e.removeData(g),o.length||clearTimeout(a)},add:function(e){function n(e,n,o){var r=t(this),l=t.data(this,g)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[u]&&this[l])return!1;var a;return t.isFunction(e)?(a=e,n):(a=e.handler,void(e.handler=n))}}}(e,window),t("util",i)}); \ No newline at end of file -- Gitee From a536b8dea2755d7fb33dea234e8991531c69e788 Mon Sep 17 00:00:00 2001 From: art Date: Thu, 24 Oct 2019 10:29:57 +0800 Subject: [PATCH 06/39] te --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c328f07..b7689df 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ - 19/4/30 **升级admin监控** **博客采用vue前后分离基于jwt鉴权,博客单独分离出一个项目地址:[len-blog-ui](https://gitee.com/bweird/len-blog-ui)** ## 头像说明 + ``` 修改 application.yml imagePath 路径 把image文件夹图片赋值进路径,即可正常展示头像 ``` -- Gitee From f8eede541c51143cb72f7b5013bb545346e25ad0 Mon Sep 17 00:00:00 2001 From: art Date: Thu, 24 Oct 2019 10:35:11 +0800 Subject: [PATCH 07/39] =?UTF-8?q?=E5=8D=87=E7=BA=A7layui=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=89=8D=E7=AB=AF=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/len/actlistener/ListenUserRole.java | 29 +- .../len/controller/ActivitiController.java | 29 +- .../len/controller/UserLeaveController.java | 14 +- .../com/len/controller/ArticleController.java | 5 +- .../len/controller/BlogAdminController.java | 21 +- .../com/len/controller/SignController.java | 6 +- .../len/core/exception/CustomException.java | 14 +- .../com/len/service/BlogArticleService.java | 7 +- .../service/impl/BlogArticleServiceImpl.java | 10 +- .../main/java/com/len/redis/RedisService.java | 10 +- .../main/java/com/len/util/LenResponse.java | 55 ++++ .../com/len/controller/JobController.java | 38 +-- .../com/len/controller/LogController.java | 8 +- .../com/len/controller/MenuController.java | 24 +- .../com/len/controller/PersonController.java | 6 +- .../com/len/controller/RoleController.java | 14 +- .../com/len/controller/UserController.java | 34 +- .../main/java/com/len/service/JobService.java | 5 +- .../java/com/len/service/MenuService.java | 4 +- .../java/com/len/service/RoleService.java | 8 +- .../java/com/len/service/SysUserService.java | 4 +- .../com/len/service/impl/JobServiceImpl.java | 6 +- .../com/len/service/impl/MenuServiceImpl.java | 6 +- .../com/len/service/impl/RoleServiceImpl.java | 16 +- .../len/service/impl/SysUserServiceImpl.java | 13 +- len-sys/src/main/resources/ftl/main/main.ftl | 22 +- .../main/resources/ftl/system/job/jobList.ftl | 6 +- .../resources/ftl/system/menu/menuList.ftl | 4 +- .../resources/ftl/system/user/userList.ftl | 48 ++- .../main/resources/plugin/build/css/app.css | 2 +- .../plugin/build/css/themes/blue.css | 64 +++- .../plugin/build/css/themes/default.css | 9 +- .../plugin/build/css/themes/orange.css | 106 +++++- .../src/main/resources/plugin/build/js/tab.js | 6 +- .../main/resources/plugin/layui/css/layui.css | 4 +- .../plugin/layui/css/layui.mobile.css | 2 +- .../plugin/layui/css/modules/code.css | 2 +- .../css/modules/laydate/default/laydate.css | 2 +- .../layui/css/modules/layer/default/layer.css | 2 +- .../resources/plugin/layui/font/iconfont.eot | Bin 37712 -> 41712 bytes .../resources/plugin/layui/font/iconfont.svg | 308 ++++++++++-------- .../resources/plugin/layui/font/iconfont.ttf | Bin 37536 -> 41536 bytes .../resources/plugin/layui/font/iconfont.woff | Bin 24684 -> 27256 bytes .../plugin/layui/font/iconfont.woff2 | Bin 0 -> 23140 bytes .../plugin/layui/lay/modules/carousel.js | 4 +- .../plugin/layui/lay/modules/code.js | 2 +- .../plugin/layui/lay/modules/colorpicker.js | 2 + .../plugin/layui/lay/modules/element.js | 4 +- .../plugin/layui/lay/modules/flow.js | 2 +- .../plugin/layui/lay/modules/form.js | 4 +- .../plugin/layui/lay/modules/jquery.js | 2 +- .../plugin/layui/lay/modules/laydate.js | 4 +- .../plugin/layui/lay/modules/layedit.js | 4 +- .../plugin/layui/lay/modules/layer.js | 4 +- .../plugin/layui/lay/modules/laypage.js | 4 +- .../plugin/layui/lay/modules/laytpl.js | 2 +- .../plugin/layui/lay/modules/mobile.js | 4 +- .../plugin/layui/lay/modules/rate.js | 2 + .../plugin/layui/lay/modules/slider.js | 2 + .../plugin/layui/lay/modules/table.js | 4 +- .../plugin/layui/lay/modules/transfer.js | 2 + .../plugin/layui/lay/modules/tree.js | 4 +- .../plugin/layui/lay/modules/upload.js | 4 +- .../main/resources/plugin/layui/layui.all.js | 6 +- .../src/main/resources/plugin/layui/layui.js | 4 +- .../src/main/resources/plugin/lenos/main.css | 25 +- .../java/com/len/config/SocketConfig.java | 13 + pom.xml | 5 +- 68 files changed, 693 insertions(+), 393 deletions(-) create mode 100644 len-core/src/main/java/com/len/util/LenResponse.java create mode 100644 len-sys/src/main/resources/plugin/layui/font/iconfont.woff2 create mode 100644 len-sys/src/main/resources/plugin/layui/lay/modules/colorpicker.js create mode 100644 len-sys/src/main/resources/plugin/layui/lay/modules/rate.js create mode 100644 len-sys/src/main/resources/plugin/layui/lay/modules/slider.js create mode 100644 len-sys/src/main/resources/plugin/layui/lay/modules/transfer.js create mode 100644 len-web/src/main/java/com/len/config/SocketConfig.java diff --git a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java index 17b841c..30736a0 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java +++ b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java @@ -18,9 +18,8 @@ package com.len.actlistener; import com.len.entity.SysRole; import com.len.entity.SysRoleUser; import com.len.entity.SysUser; -import com.len.service.ActAssigneeService; import com.len.service.SysUserService; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import java.util.ArrayList; import java.util.Arrays; @@ -31,9 +30,7 @@ import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.persistence.entity.GroupEntity; import org.activiti.engine.impl.persistence.entity.UserEntity; -import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; @@ -62,7 +59,7 @@ public class ListenUserRole { * * @param joinPoint */ - @Around("execution(com.len.util.JsonUtil com.len.controller.UserController.updateUser(*,String[]))") + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.updateUser(*,String[]))") public Object listenerUserUpdate(ProceedingJoinPoint joinPoint) throws Throwable { Object o = new Object(); //更新前拿到用户-角色数据 @@ -73,7 +70,7 @@ public class ListenUserRole { List strings = new ArrayList<>(); keyList.forEach(sysRoleUser1 -> strings.add(sysRoleUser1.getRoleId())); o = joinPoint.proceed(joinPoint.getArgs()); - JsonUtil jsonUtil = (JsonUtil) o; + LenResponse jsonUtil = (LenResponse) o; if (jsonUtil.isFlag()) { changeUser(args, strings); } @@ -85,12 +82,12 @@ public class ListenUserRole { * * @param joinPoint */ - @Around("execution(com.len.util.JsonUtil com.len.controller.UserController.addUser(*,String[]))") + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.addUser(*,String[]))") public Object listenerUserInsert(ProceedingJoinPoint joinPoint) throws Throwable { Object o = joinPoint.proceed(joinPoint.getArgs()); Object[] args = joinPoint.getArgs(); if (args.length == 2) { - JsonUtil jsonUtil = (JsonUtil) o; + LenResponse jsonUtil = (LenResponse) o; if (jsonUtil.isFlag()) { changeUser(args, Arrays.asList((String[]) args[1])); } @@ -98,10 +95,10 @@ public class ListenUserRole { return o; } - @Around("execution(com.len.util.JsonUtil com.len.controller.UserController.del(..))") + @Around("execution(com.len.util.LenResponse com.len.controller.UserController.del(..))") public Object listenDelUser(ProceedingJoinPoint point) throws Throwable { Object o = point.proceed(point.getArgs()); - JsonUtil util = (JsonUtil) o; + LenResponse util = (LenResponse) o; if (util.isFlag()) { Object[] args = point.getArgs(); identityService.deleteUser((String) args[0]); @@ -140,10 +137,10 @@ public class ListenUserRole { /**********************角色处理begin***************************/ - @Around("execution(com.len.util.JsonUtil com.len.controller.RoleController.addRole(*,String[]))") + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.addRole(*,String[]))") public Object listenRoleInsert(ProceedingJoinPoint joinPoint) throws Throwable { Object o = joinPoint.proceed(joinPoint.getArgs()); - JsonUtil j = (JsonUtil) o; + LenResponse j = (LenResponse) o; if (j.isFlag()) { Object[] args = joinPoint.getArgs(); if (args.length == 2) { @@ -153,12 +150,12 @@ public class ListenUserRole { return o; } - @Around("execution(com.len.util.JsonUtil com.len.controller.RoleController.updateUser(*,String[]))") + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.updateUser(*,String[]))") public Object listenRoleUpdate(ProceedingJoinPoint joinPoint) throws Throwable { Object o = joinPoint.proceed(joinPoint.getArgs()); Object[] args = joinPoint.getArgs(); if (args.length == 2) { - if (((JsonUtil) o).isFlag()) { + if (((LenResponse) o).isFlag()) { changeRole(args); } } @@ -166,10 +163,10 @@ public class ListenUserRole { return o; } - @Around("execution(com.len.util.JsonUtil com.len.controller.RoleController.del(..))") + @Around("execution(com.len.util.LenResponse com.len.controller.RoleController.del(..))") public Object listenDelRole(ProceedingJoinPoint point) throws Throwable { Object o = point.proceed(point.getArgs()); - JsonUtil util = (JsonUtil) o; + LenResponse util = (LenResponse) o; if (util.isFlag()) { Object[] args = point.getArgs(); identityService.deleteGroup((String) args[0]); diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java index a3802be..25c12c2 100644 --- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java +++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java @@ -15,7 +15,6 @@ */ package com.len.controller; -import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -28,7 +27,7 @@ import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.service.SysUserService; import com.len.util.Checkbox; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.BpmnModel; @@ -105,8 +104,8 @@ public class ActivitiController extends BaseController { */ @PostMapping(value = "syncdata") @ResponseBody - public JsonUtil syncdata() { - JsonUtil j = new JsonUtil(); + public LenResponse syncdata() { + LenResponse j = new LenResponse(); try { List userList = userService.selectListByPage(new SysUser()); User au = null; @@ -251,21 +250,21 @@ public class ActivitiController extends BaseController { */ @PostMapping(value = "open") @ResponseBody - public JsonUtil open(String id) { + public LenResponse open(String id) { String msg = "发布成功"; - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); try { Model modelData = repositoryService.getModel(id); byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); if (bytes == null) { - return JsonUtil.error("模型为空"); + return LenResponse.error("模型为空"); } JsonNode modelNode = null; modelNode = new ObjectMapper().readTree(bytes); BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); if (model.getProcesses().size() == 0) { - return JsonUtil.error("数据不符合要求"); + return LenResponse.error("数据不符合要求"); } byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); //发布流程 @@ -348,8 +347,8 @@ public class ActivitiController extends BaseController { */ @PostMapping("goAssignee/updateNode") @ResponseBody - public JsonUtil updateNode(HttpServletRequest request) { - JsonUtil j = new JsonUtil(); + public LenResponse updateNode(HttpServletRequest request) { + LenResponse j = new LenResponse(); Map map = request.getParameterMap(); List assigneeList = new ArrayList<>(); @@ -386,8 +385,8 @@ public class ActivitiController extends BaseController { */ @PostMapping("delDeploy") @ResponseBody - public JsonUtil delDeploy(org.springframework.ui.Model model, String id) { - JsonUtil j = new JsonUtil(); + public LenResponse delDeploy(org.springframework.ui.Model model, String id) { + LenResponse j = new LenResponse(); try { List activityList = actAssigneeService.getActivityList(id); for (ActivityImpl activity : activityList) { @@ -413,13 +412,13 @@ public class ActivitiController extends BaseController { @PostMapping("delModel") @ResponseBody - public JsonUtil delModel(org.springframework.ui.Model model, String id) { + public LenResponse delModel(org.springframework.ui.Model model, String id) { FileInputStream inputStream = null; String modelId = actPropertiesConfig.getModelId(); if (id.equals(modelId)) { - return JsonUtil.error("演示禁止删除"); + return LenResponse.error("演示禁止删除"); } - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); try { repositoryService.deleteModel(id); j.setMsg("删除成功"); diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java index 042bcff..6747e4c 100644 --- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java +++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java @@ -198,8 +198,8 @@ public class UserLeaveController extends BaseController { @PostMapping("updateLeave/updateLeave/{taskId}/{id}/{flag}") @ResponseBody - public JsonUtil updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) { - JsonUtil j = new JsonUtil(); + public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) { + LenResponse j = new LenResponse(); try { UserLeave oldLeave = leaveService.selectByPrimaryKey(leave.getId()); BeanUtil.copyNotNullBean(leave, oldLeave); @@ -226,10 +226,10 @@ public class UserLeaveController extends BaseController { @PostMapping("addLeave") @ResponseBody - public JsonUtil addLeave(Model model, UserLeave userLeave) { - JsonUtil j = new JsonUtil(); + public LenResponse addLeave(Model model, UserLeave userLeave) { + LenResponse j = new LenResponse(); if (userLeave == null) { - return JsonUtil.error("获取数据失败"); + return LenResponse.error("获取数据失败"); } userLeave.setDays(3); CurrentUser user = CommonUtil.getUser(); @@ -335,14 +335,14 @@ public class UserLeaveController extends BaseController { @PostMapping("agent/complete") @ResponseBody - public JsonUtil complete(LeaveOpinion op, HttpServletRequest request) { + public LenResponse complete(LeaveOpinion op, HttpServletRequest request) { Map variables = taskService.getVariables(op.getTaskId()); CurrentUser user = Principal.getCurrentUse(); op.setCreateTime(new Date()); op.setOpId(user.getId()); op.setOpName(user.getRealName()); - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); Map map = new HashMap<>(); map.put("flag", op.isFlag()); diff --git a/len-blog/src/main/java/com/len/controller/ArticleController.java b/len-blog/src/main/java/com/len/controller/ArticleController.java index 04f99f3..28bcded 100644 --- a/len-blog/src/main/java/com/len/controller/ArticleController.java +++ b/len-blog/src/main/java/com/len/controller/ArticleController.java @@ -8,7 +8,7 @@ import com.len.service.ArticleCategoryService; import com.len.service.BlogArticleService; import com.len.service.BlogCategoryService; import com.len.util.IpUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -17,7 +17,6 @@ import tk.mybatis.mapper.entity.Condition; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.List; /** @@ -80,7 +79,7 @@ public class ArticleController { * @return */ @GetMapping("/article/getDetail/{code}") - public JsonUtil detail(@PathVariable("code") String code, HttpServletRequest request) { + public LenResponse detail(@PathVariable("code") String code, HttpServletRequest request) { String ip = IpUtil.getIp(request); return articleService.detail(code, ip); } diff --git a/len-blog/src/main/java/com/len/controller/BlogAdminController.java b/len-blog/src/main/java/com/len/controller/BlogAdminController.java index 6a78bb0..d14a19f 100644 --- a/len-blog/src/main/java/com/len/controller/BlogAdminController.java +++ b/len-blog/src/main/java/com/len/controller/BlogAdminController.java @@ -5,7 +5,7 @@ import com.len.entity.BlogArticle; import com.len.entity.BlogCategory; import com.len.model.Article; import com.len.service.*; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import com.len.util.UploadUtil; import lombok.extern.slf4j.Slf4j; @@ -18,7 +18,6 @@ import org.springframework.web.multipart.MultipartHttpServletRequest; import java.util.Comparator; import java.util.List; -import java.util.regex.Pattern; /** * @author zhuxiaomeng @@ -58,13 +57,13 @@ public class BlogAdminController { * @return */ @GetMapping("/article/getDetail/{code}") - public JsonUtil getDetail(@PathVariable("code") String code) { + public LenResponse getDetail(@PathVariable("code") String code) { return articleService.getDetail(code); } @GetMapping("/article/getCategory") - public JsonUtil getCategory() { - JsonUtil json = new JsonUtil(); + public LenResponse getCategory() { + LenResponse json = new LenResponse(); List categories = categoryService.selectAll(); categories.sort(Comparator.comparing(BlogCategory::getSequence)); json.setData(categories); @@ -72,10 +71,10 @@ public class BlogAdminController { } @PostMapping("/article/addImage") - public JsonUtil addImage(MultipartHttpServletRequest request) { + public LenResponse addImage(MultipartHttpServletRequest request) { MultipartFile multipartFile = request.getFile("file"); String path = uploadUtil.upload(multipartFile); - JsonUtil json = new JsonUtil(); + LenResponse json = new LenResponse(); StringBuffer requestURL = request.getRequestURL(); int serverPort = request.getServerPort(); int i = requestURL.indexOf(String.valueOf(serverPort)); @@ -86,8 +85,8 @@ public class BlogAdminController { } @PostMapping("/article/add") - public JsonUtil addArticle(@RequestBody ArticleDetail detail) { - JsonUtil json = new JsonUtil(); + public LenResponse addArticle(@RequestBody ArticleDetail detail) { + LenResponse json = new LenResponse(); json.setStatus(400); Article article = detail.getArticle(); if (article == null) { @@ -118,8 +117,8 @@ public class BlogAdminController { } @PostMapping("/article/update") - public JsonUtil updateArticle(@RequestBody ArticleDetail detail) { - JsonUtil json = new JsonUtil(); + public LenResponse updateArticle(@RequestBody ArticleDetail detail) { + LenResponse json = new LenResponse(); Article article = detail.getArticle(); json.setFlag(false); json.setStatus(400); diff --git a/len-blog/src/main/java/com/len/controller/SignController.java b/len-blog/src/main/java/com/len/controller/SignController.java index aeb8f8b..97265fc 100644 --- a/len-blog/src/main/java/com/len/controller/SignController.java +++ b/len-blog/src/main/java/com/len/controller/SignController.java @@ -7,7 +7,7 @@ import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.service.SysUserService; import com.len.util.JWTUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.Md5Util; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -52,7 +52,7 @@ public class SignController { @ApiOperation(value = "/blogLogin", httpMethod = "POST", notes = "登录method") @PostMapping(value = "/blogLogin") - public JsonUtil blogLogin(SysUser user) { + public LenResponse blogLogin(SysUser user) { if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword())) { throw new UnknownAccountException("用户名或密码不能为空"); } @@ -95,6 +95,6 @@ public class SignController { .map(SysRole::getRoleName) .collect(Collectors.toList()); - return new JsonUtil(true, JWTUtil.sign(sysUser.getUsername(), sysUser.getId(), roleNames, sysUser.getPassword()), 200); + return new LenResponse(true, JWTUtil.sign(sysUser.getUsername(), sysUser.getId(), roleNames, sysUser.getPassword()), 200); } } diff --git a/len-blog/src/main/java/com/len/core/exception/CustomException.java b/len-blog/src/main/java/com/len/core/exception/CustomException.java index 41325ad..45cff31 100644 --- a/len-blog/src/main/java/com/len/core/exception/CustomException.java +++ b/len-blog/src/main/java/com/len/core/exception/CustomException.java @@ -1,6 +1,6 @@ package com.len.core.exception; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UnknownAccountException; import org.springframework.http.HttpStatus; @@ -19,19 +19,19 @@ public class CustomException { @ResponseStatus(HttpStatus.UNAUTHORIZED) @ExceptionHandler(AuthenticationException.class) - public JsonUtil getAuthenticationException(AuthenticationException e) { - return new JsonUtil(false, e.getMessage(), 401); + public LenResponse getAuthenticationException(AuthenticationException e) { + return new LenResponse(false, e.getMessage(), 401); } @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(UnknownAccountException.class) - public JsonUtil getUnknownAccountException(UnknownAccountException e) { - return new JsonUtil(false, e.getMessage(), 401); + public LenResponse getUnknownAccountException(UnknownAccountException e) { + return new LenResponse(false, e.getMessage(), 401); } @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(UnauthorizedException.class) - public JsonUtil getUnauthorizedException(UnauthorizedException e) { - return new JsonUtil(false, e.getMessage(), 401); + public LenResponse getUnauthorizedException(UnauthorizedException e) { + return new LenResponse(false, e.getMessage(), 401); } } diff --git a/len-blog/src/main/java/com/len/service/BlogArticleService.java b/len-blog/src/main/java/com/len/service/BlogArticleService.java index 7c2bb4f..c26ae88 100644 --- a/len-blog/src/main/java/com/len/service/BlogArticleService.java +++ b/len-blog/src/main/java/com/len/service/BlogArticleService.java @@ -4,8 +4,7 @@ import com.len.base.BaseService; import com.len.entity.ArticleDetail; import com.len.entity.BlogArticle; import com.len.model.Article; -import com.len.util.JsonUtil; -import org.springframework.web.bind.annotation.RequestBody; +import com.len.util.LenResponse; import java.util.Date; import java.util.List; @@ -19,9 +18,9 @@ public interface BlogArticleService extends BaseService { List
    indexSelect(); - public JsonUtil getDetail(String code); + public LenResponse getDetail(String code); - public JsonUtil detail(String code,String ip); + public LenResponse detail(String code, String ip); List
    selectArticle(String code); diff --git a/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java index 9b12ef7..391373b 100644 --- a/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java @@ -11,7 +11,7 @@ import com.len.model.SimpleArticle; import com.len.redis.RedisService; import com.len.service.*; import com.len.util.BeanUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -112,8 +112,8 @@ public class BlogArticleServiceImpl extends BaseServiceImpl } @Override - public JsonUtil getDetail(String code) { - JsonUtil json = new JsonUtil(); + public LenResponse getDetail(String code) { + LenResponse json = new LenResponse(); ArticleDetail detail = getArticleByCode(code); if (detail == null) { json.setStatus(404); @@ -127,8 +127,8 @@ public class BlogArticleServiceImpl extends BaseServiceImpl } @Override - public JsonUtil detail(String code, String ip) { - JsonUtil json = new JsonUtil(); + public LenResponse detail(String code, String ip) { + LenResponse json = new LenResponse(); ArticleDetail detail = getArticleByCode(code); if (detail == null) { json.setStatus(404); diff --git a/len-core/src/main/java/com/len/redis/RedisService.java b/len-core/src/main/java/com/len/redis/RedisService.java index d27c3ec..b673a9d 100644 --- a/len-core/src/main/java/com/len/redis/RedisService.java +++ b/len-core/src/main/java/com/len/redis/RedisService.java @@ -16,19 +16,19 @@ import java.util.concurrent.TimeUnit; * @email 154040976@qq.com */ @Service -public class RedisService { +public class RedisService { @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired - private RedisTemplate redisTemplate; + private RedisTemplate redisTemplate; @Resource(name = "stringRedisTemplate") private ValueOperations valueOps; @Resource(name = "redisTemplate") - private ValueOperations valOpsObj; + private ValueOperations valOpsObj; @Value("${redis.prefix}") private String prefix; @@ -62,7 +62,7 @@ public class RedisService { * @param key obj key * @return obj value */ - public Object getObj(Object key) { + public T getObj(Object key) { key = prefix + key.toString(); return valOpsObj.get(key); } @@ -74,7 +74,7 @@ public class RedisService { * @param value obj value * @param second 过期时间 单位户 秒 */ - public void setObj(Object key, Object value, Long second) { + public void setObj(Object key, T value, Long second) { key = prefix + key.toString(); valOpsObj.set(key, value, second,TimeUnit.SECONDS); } diff --git a/len-core/src/main/java/com/len/util/LenResponse.java b/len-core/src/main/java/com/len/util/LenResponse.java new file mode 100644 index 0000000..1b1a520 --- /dev/null +++ b/len-core/src/main/java/com/len/util/LenResponse.java @@ -0,0 +1,55 @@ +package com.len.util; + + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +/** + * @author zhuxiaomeng + * @date 2017/12/15. + * @email 154040976@qq.com + * ajax 回执 + */ +@Data +public class LenResponse { + + //默认成功 + private boolean flag = true; + private String msg; + private JSONObject josnObj; + private Integer status; + private Object data; + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + public LenResponse() { + } + + public LenResponse(boolean flag, String msg) { + this.flag = flag; + this.msg = msg; + } + + public LenResponse(boolean flag, String msg, Integer status) { + this.flag = flag; + this.msg = msg; + this.status = status; + } + + /** + * restful 返回 + */ + public static LenResponse error(String msg) { + return new LenResponse(false, msg); + } + + public static LenResponse sucess(String msg) { + return new LenResponse(true, msg); + } +} diff --git a/len-sys/src/main/java/com/len/controller/JobController.java b/len-sys/src/main/java/com/len/controller/JobController.java index ad702fc..f09f595 100644 --- a/len-sys/src/main/java/com/len/controller/JobController.java +++ b/len-sys/src/main/java/com/len/controller/JobController.java @@ -7,7 +7,7 @@ import com.len.core.quartz.JobTask; import com.len.entity.SysJob; import com.len.exception.MyException; import com.len.service.JobService; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -61,8 +61,8 @@ public class JobController extends BaseController { @Log(desc = "添加任务") @PostMapping(value = "addJob") @ResponseBody - public JsonUtil addJob(SysJob job) { - JsonUtil j = new JsonUtil(); + public LenResponse addJob(SysJob job) { + LenResponse j = new LenResponse(); String msg = "保存成功"; job.setStatus(false); try { @@ -91,24 +91,24 @@ public class JobController extends BaseController { @Log(desc = "更新任务", type = LOG_TYPE.UPDATE) @PostMapping(value = "updateJob") @ResponseBody - public JsonUtil updateJob(SysJob job) { - JsonUtil j = new JsonUtil(); - j.setFlag(false); + public LenResponse updateJob(SysJob job) { + LenResponse lenResponse = new LenResponse(); + lenResponse.setFlag(false); if (job == null) { - j.setMsg("获取数据失败"); - return j; + lenResponse.setMsg("获取数据失败"); + return lenResponse; } if (jobTask.checkJob(job)) { - j.setMsg("已经启动任务无法更新,请停止后更新"); - return j; + lenResponse.setMsg("已经启动任务无法更新,请停止后更新"); + return lenResponse; } if (jobService.updateJob(job)) { - j.setFlag(true); - j.setData("更新成功"); + lenResponse.setFlag(true); + lenResponse.setData("更新成功"); } else { - j.setData("更新失败"); + lenResponse.setData("更新失败"); } - return j; + return lenResponse; } @Log(desc = "删除任务", type = LOG_TYPE.DEL) @@ -116,7 +116,7 @@ public class JobController extends BaseController { @PostMapping(value = "del") @ResponseBody @RequiresPermissions("job:del") - public JsonUtil del(String id) { + public LenResponse del(String id) { return jobService.del(id); } @@ -125,8 +125,8 @@ public class JobController extends BaseController { @PostMapping(value = "startJob") @ResponseBody @RequiresPermissions("job:start") - public JsonUtil startJob(String id) { - JsonUtil j = new JsonUtil(); + public LenResponse startJob(String id) { + LenResponse j = new LenResponse(); String msg = null; if (StringUtils.isEmpty(id)) { j.setMsg("获取数据失败"); @@ -146,8 +146,8 @@ public class JobController extends BaseController { @PostMapping(value = "endJob") @ResponseBody @RequiresPermissions("job:end") - public JsonUtil endJob(String id) { - JsonUtil j = new JsonUtil(); + public LenResponse endJob(String id) { + LenResponse j = new LenResponse(); String msg; if (StringUtils.isEmpty(id)) { j.setMsg("获取数据失败"); diff --git a/len-sys/src/main/java/com/len/controller/LogController.java b/len-sys/src/main/java/com/len/controller/LogController.java index e3c875d..8b7503e 100644 --- a/len-sys/src/main/java/com/len/controller/LogController.java +++ b/len-sys/src/main/java/com/len/controller/LogController.java @@ -1,20 +1,18 @@ package com.len.controller; -import com.alibaba.fastjson.JSON; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.len.base.BaseController; import com.len.entity.SysLog; import com.len.exception.MyException; import com.len.mapper.SysLogMapper; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import java.util.List; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -73,8 +71,8 @@ public class LogController extends BaseController { */ @PostMapping(value = "del") @ResponseBody - public JsonUtil del(String[] ids) { - JsonUtil j = new JsonUtil(); + public LenResponse del(String[] ids) { + LenResponse j = new LenResponse(); String msg = "删除成功"; try { for (String id : ids) { diff --git a/len-sys/src/main/java/com/len/controller/MenuController.java b/len-sys/src/main/java/com/len/controller/MenuController.java index 4c6ed36..605fbe8 100644 --- a/len-sys/src/main/java/com/len/controller/MenuController.java +++ b/len-sys/src/main/java/com/len/controller/MenuController.java @@ -8,7 +8,7 @@ import com.len.entity.SysMenu; import com.len.exception.MyException; import com.len.service.MenuService; import com.len.util.BeanUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; @@ -61,12 +61,12 @@ public class MenuController extends BaseController { @ApiOperation(value = "/addMenu", httpMethod = "POST", notes = "添加菜单") @PostMapping(value = "addMenu") @ResponseBody - public JsonUtil addMenu(SysMenu sysMenu, Model model) { - JsonUtil jsonUtil = new JsonUtil(); - jsonUtil.setFlag(false); + public LenResponse addMenu(SysMenu sysMenu, Model model) { + LenResponse lenResponse = new LenResponse(); + lenResponse.setFlag(false); if (sysMenu == null) { - jsonUtil.setMsg("获取数据失败"); - return jsonUtil; + lenResponse.setMsg("获取数据失败"); + return lenResponse; } if (StringUtils.isEmpty(sysMenu.getPId())) { sysMenu.setPId(null); @@ -83,12 +83,12 @@ public class MenuController extends BaseController { sysMenu.setMenuType((byte) 0); } menuService.insertSelective(sysMenu); - jsonUtil.setMsg("添加成功"); + lenResponse.setMsg("添加成功"); } catch (MyException e) { e.printStackTrace(); - jsonUtil.setMsg("添加失败"); + lenResponse.setMsg("添加失败"); } - return jsonUtil; + return lenResponse; } @GetMapping(value = "showUpdateMenu") @@ -108,17 +108,17 @@ public class MenuController extends BaseController { @Log(desc = "更新菜单", type = LOG_TYPE.ADD) @PostMapping(value = "updateMenu") @ResponseBody - public JsonUtil updateMenu(SysMenu sysMenu) { + public LenResponse updateMenu(SysMenu sysMenu) { SysMenu oldMenu = menuService.selectByPrimaryKey(sysMenu.getId()); BeanUtil.copyNotNullBean(sysMenu, oldMenu); menuService.updateByPrimaryKeySelective(oldMenu); - return JsonUtil.sucess("保存成功"); + return LenResponse.sucess("保存成功"); } @Log(desc = "删除菜单", type = LOG_TYPE.DEL) @PostMapping("/menu-del") @ResponseBody - public JsonUtil del(String id) { + public LenResponse del(String id) { return menuService.del(id); } diff --git a/len-sys/src/main/java/com/len/controller/PersonController.java b/len-sys/src/main/java/com/len/controller/PersonController.java index 802cad3..d2131c5 100644 --- a/len-sys/src/main/java/com/len/controller/PersonController.java +++ b/len-sys/src/main/java/com/len/controller/PersonController.java @@ -7,7 +7,7 @@ import com.len.entity.SysUser; import com.len.service.SysUserService; import com.len.util.BeanUtil; import com.len.util.Checkbox; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -51,8 +51,8 @@ public class PersonController { @Log(desc = "更新用户", type = Log.LOG_TYPE.UPDATE) @PostMapping(value = "updateUser") @ResponseBody - public JsonUtil updatePerson(SysUser user) { - JsonUtil jsonUtil = new JsonUtil(); + public LenResponse updatePerson(SysUser user) { + LenResponse jsonUtil = new LenResponse(); jsonUtil.setFlag(false); if (user == null) { jsonUtil.setMsg("获取数据失败"); diff --git a/len-sys/src/main/java/com/len/controller/RoleController.java b/len-sys/src/main/java/com/len/controller/RoleController.java index d07b87b..8745de7 100644 --- a/len-sys/src/main/java/com/len/controller/RoleController.java +++ b/len-sys/src/main/java/com/len/controller/RoleController.java @@ -8,7 +8,7 @@ import com.len.entity.SysRole; import com.len.service.MenuService; import com.len.service.RoleMenuService; import com.len.service.RoleService; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.ReType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -76,9 +76,9 @@ public class RoleController extends BaseController { @Log(desc = "添加角色") @PostMapping(value = "addRole") @ResponseBody - public JsonUtil addRole(SysRole sysRole, String[] menus) { + public LenResponse addRole(SysRole sysRole, String[] menus) { if (StringUtils.isEmpty(sysRole.getRoleName())) { - JsonUtil.error("角色名称不能为空"); + LenResponse.error("角色名称不能为空"); } return roleService.addRole(sysRole, menus); } @@ -99,9 +99,9 @@ public class RoleController extends BaseController { @Log(desc = "更新角色") @PostMapping(value = "updateRole") @ResponseBody - public JsonUtil updateUser(SysRole role, String[] menus) { + public LenResponse updateUser(SysRole role, String[] menus) { if (role == null) { - return JsonUtil.error("获取数据失败"); + return LenResponse.error("获取数据失败"); } return roleService.updateUser(role, menus); } @@ -111,9 +111,9 @@ public class RoleController extends BaseController { @PostMapping(value = "del") @ResponseBody @RequiresPermissions("role:del") - public JsonUtil del(String id) { + public LenResponse del(String id) { if (StringUtils.isEmpty(id)) { - return JsonUtil.error("获取数据失败"); + return LenResponse.error("获取数据失败"); } return roleService.del(id); } diff --git a/len-sys/src/main/java/com/len/controller/UserController.java b/len-sys/src/main/java/com/len/controller/UserController.java index 147e98d..42e7995 100644 --- a/len-sys/src/main/java/com/len/controller/UserController.java +++ b/len-sys/src/main/java/com/len/controller/UserController.java @@ -95,24 +95,24 @@ public class UserController extends BaseController { @Log(desc = "添加用户") @PostMapping(value = "addUser") @ResponseBody - public JsonUtil addUser(SysUser user, String[] role) { + public LenResponse addUser(SysUser user, String[] role) { if (user == null) { - return JsonUtil.error("获取数据失败"); + return LenResponse.error("获取数据失败"); } if (StringUtils.isBlank(user.getUsername())) { - return JsonUtil.error("用户名不能为空"); + return LenResponse.error("用户名不能为空"); } if (StringUtils.isBlank(user.getPassword())) { - return JsonUtil.error("密码不能为空"); + return LenResponse.error("密码不能为空"); } if (role == null) { - return JsonUtil.error("请选择角色"); + return LenResponse.error("请选择角色"); } int result = userService.checkUser(user.getUsername()); if (result > 0) { - return JsonUtil.error("用户名已存在"); + return LenResponse.error("用户名已存在"); } - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); try { userService.insertSelective(user); SysRoleUser sysRoleUser = new SysRoleUser(); @@ -147,8 +147,8 @@ public class UserController extends BaseController { @Log(desc = "更新用户", type = LOG_TYPE.UPDATE) @PostMapping(value = "updateUser") @ResponseBody - public JsonUtil updateUser(SysUser user, String role[]) { - JsonUtil jsonUtil = new JsonUtil(); + public LenResponse updateUser(SysUser user, String role[]) { + LenResponse jsonUtil = new LenResponse(); jsonUtil.setFlag(false); if (user == null) { jsonUtil.setMsg("获取数据失败"); @@ -185,7 +185,7 @@ public class UserController extends BaseController { @PostMapping(value = "/del") @ResponseBody @RequiresPermissions("user:del") - public JsonUtil del(String id, boolean flag) { + public LenResponse del(String id, boolean flag) { return userService.delById(id, flag); } @@ -211,9 +211,9 @@ public class UserController extends BaseController { @PostMapping(value = "rePass") @ResponseBody @RequiresPermissions("user:repass") - public JsonUtil rePass(String id, String pass, String newPwd) { + public LenResponse rePass(String id, String pass, String newPwd) { boolean flag = StringUtils.isEmpty(id) || StringUtils.isEmpty(pass) || StringUtils.isEmpty(newPwd); - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); j.setFlag(false); if (flag) { j.setMsg("获取数据失败,修改失败"); @@ -250,10 +250,10 @@ public class UserController extends BaseController { */ @PostMapping(value = "upload") @ResponseBody - public JsonUtil imgUpload(HttpServletRequest req, @RequestParam("file") MultipartFile file, - ModelMap model) { + public LenResponse imgUpload(HttpServletRequest req, @RequestParam("file") MultipartFile file, + ModelMap model) { String fileName = uploadUtil.upload(file); - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); j.setMsg(fileName); return j; } @@ -263,8 +263,8 @@ public class UserController extends BaseController { */ @GetMapping(value = "checkUser") @ResponseBody - public JsonUtil checkUser(String uname, HttpServletRequest req) { - JsonUtil j = new JsonUtil(); + public LenResponse checkUser(String uname, HttpServletRequest req) { + LenResponse j = new LenResponse(); j.setFlag(Boolean.FALSE); if (StringUtils.isEmpty(uname)) { j.setMsg("获取数据失败"); diff --git a/len-sys/src/main/java/com/len/service/JobService.java b/len-sys/src/main/java/com/len/service/JobService.java index 68d0ca9..3dbadd6 100644 --- a/len-sys/src/main/java/com/len/service/JobService.java +++ b/len-sys/src/main/java/com/len/service/JobService.java @@ -2,8 +2,7 @@ package com.len.service; import com.len.base.BaseService; import com.len.entity.SysJob; -import com.len.entity.SysMenu; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; /** * @author zhuxiaomeng @@ -24,7 +23,7 @@ public interface JobService extends BaseService { * @param id * @return */ - public JsonUtil del(String id); + public LenResponse del(String id); /** * 启动任务 diff --git a/len-sys/src/main/java/com/len/service/MenuService.java b/len-sys/src/main/java/com/len/service/MenuService.java index f8ba378..6ab3610 100644 --- a/len-sys/src/main/java/com/len/service/MenuService.java +++ b/len-sys/src/main/java/com/len/service/MenuService.java @@ -3,7 +3,7 @@ package com.len.service; import com.alibaba.fastjson.JSONArray; import com.len.base.BaseService; import com.len.entity.SysMenu; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import java.util.List; @@ -32,6 +32,6 @@ public interface MenuService extends BaseService { public JSONArray getMenuJsonByUser(List menuList); - public JsonUtil del(String id); + public LenResponse del(String id); } diff --git a/len-sys/src/main/java/com/len/service/RoleService.java b/len-sys/src/main/java/com/len/service/RoleService.java index e34e8a9..cf0fd22 100644 --- a/len-sys/src/main/java/com/len/service/RoleService.java +++ b/len-sys/src/main/java/com/len/service/RoleService.java @@ -2,7 +2,7 @@ package com.len.service; import com.len.base.BaseService; import com.len.entity.SysRole; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import java.util.List; @@ -35,9 +35,9 @@ public interface RoleService extends BaseService { @Override List selectListByPage(SysRole sysRole); - public JsonUtil addRole(SysRole sysRole, String[] menus); + public LenResponse addRole(SysRole sysRole, String[] menus); - public JsonUtil updateUser(SysRole role, String[] menus); + public LenResponse updateUser(SysRole role, String[] menus); - public JsonUtil del(String id); + public LenResponse del(String id); } diff --git a/len-sys/src/main/java/com/len/service/SysUserService.java b/len-sys/src/main/java/com/len/service/SysUserService.java index a894ef5..4923a5d 100644 --- a/len-sys/src/main/java/com/len/service/SysUserService.java +++ b/len-sys/src/main/java/com/len/service/SysUserService.java @@ -5,7 +5,7 @@ import com.len.base.BaseService; import com.len.entity.SysRoleUser; import com.len.entity.SysUser; import com.len.util.Checkbox; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import java.util.List; /** @@ -42,7 +42,7 @@ public interface SysUserService extends BaseService { * @param id * @return */ - JsonUtil delById(String id,boolean flag); + LenResponse delById(String id, boolean flag); int checkUser(String username); diff --git a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java index ec2138b..a4b3979 100644 --- a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java @@ -8,7 +8,7 @@ import com.len.exception.MyException; import com.len.mapper.SysJobMapper; import com.len.service.JobService; import com.len.util.BeanUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -51,8 +51,8 @@ public class JobServiceImpl extends BaseServiceImpl implements J } @Override - public JsonUtil del(String id) { - JsonUtil j = new JsonUtil(); + public LenResponse del(String id) { + LenResponse j = new LenResponse(); j.setFlag(false); if (StringUtils.isEmpty(id)) { j.setMsg("获取数据失败"); diff --git a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java index 8e6c9a4..da7e5d9 100644 --- a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java @@ -9,7 +9,7 @@ import com.len.mapper.SysMenuMapper; import com.len.mapper.SysRoleMenuMapper; import com.len.service.MenuService; import com.len.service.RoleMenuService; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.TreeUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -114,8 +114,8 @@ public class MenuServiceImpl extends BaseServiceImpl implements } @Override - public JsonUtil del(String id) { - JsonUtil json = new JsonUtil(); + public LenResponse del(String id) { + LenResponse json = new LenResponse(); json.setFlag(false); if (StringUtils.isEmpty(id)) { json.setMsg("获取数据失败,请刷新重试!"); diff --git a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java index 69e33e0..fdbd22a 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java @@ -11,7 +11,7 @@ import com.len.service.RoleMenuService; import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.util.BeanUtil; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -71,8 +71,8 @@ public class RoleServiceImpl extends BaseServiceImpl implements } @Override - public JsonUtil addRole(SysRole sysRole, String[] menus) { - JsonUtil j = new JsonUtil(); + public LenResponse addRole(SysRole sysRole, String[] menus) { + LenResponse j = new LenResponse(); try { insertSelective(sysRole); //操作role-menu data @@ -95,8 +95,8 @@ public class RoleServiceImpl extends BaseServiceImpl implements } @Override - public JsonUtil updateUser(SysRole role, String[] menus) { - JsonUtil jsonUtil = new JsonUtil(); + public LenResponse updateUser(SysRole role, String[] menus) { + LenResponse jsonUtil = new LenResponse(); jsonUtil.setFlag(false); try { SysRole oldRole = selectByPrimaryKey(role.getId()); @@ -124,14 +124,14 @@ public class RoleServiceImpl extends BaseServiceImpl implements } @Override - public JsonUtil del(String id) { + public LenResponse del(String id) { SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setRoleId(id); - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); try { int count = roleUserService.selectCountByCondition(sysRoleUser); if (count > 0) { - return JsonUtil.error("已分配给用户,删除失败"); + return LenResponse.error("已分配给用户,删除失败"); } deleteByPrimaryKey(id); j.setMsg("删除成功"); diff --git a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java index 5c43705..ef73070 100644 --- a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java @@ -20,12 +20,11 @@ import com.len.service.RoleUserService; import com.len.service.SysUserService; import com.len.util.BeanUtil; import com.len.util.Checkbox; -import com.len.util.JsonUtil; +import com.len.util.LenResponse; import com.len.util.Md5Util; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; @@ -134,21 +133,21 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme } @Override - public JsonUtil delById(String id, boolean flag) { + public LenResponse delById(String id, boolean flag) { if (StringUtils.isEmpty(id)) { - return JsonUtil.error("获取数据失败"); + return LenResponse.error("获取数据失败"); } - JsonUtil j = new JsonUtil(); + LenResponse j = new LenResponse(); try { SysUser sysUser = selectByPrimaryKey(id); if (ADMIN.equals(sysUser.getUsername())) { - return JsonUtil.error("超管无法删除"); + return LenResponse.error("超管无法删除"); } SysRoleUser roleUser = new SysRoleUser(); roleUser.setUserId(id); int count = roleUserService.selectCountByCondition(roleUser); if (count > 0) { - return JsonUtil.error("账户已经绑定角色,无法删除"); + return LenResponse.error("账户已经绑定角色,无法删除"); } if (flag) { //逻辑 diff --git a/len-sys/src/main/resources/ftl/main/main.ftl b/len-sys/src/main/resources/ftl/main/main.ftl index 662aa1a..de89cfd 100644 --- a/len-sys/src/main/resources/ftl/main/main.ftl +++ b/len-sys/src/main/resources/ftl/main/main.ftl @@ -10,9 +10,9 @@ @@ -42,11 +42,11 @@
    默认
    -
    橘子橙
    -
    春天绿
    -
    少女粉
    -
    天空蓝
    -
    枫叶红
    +
    +
    绿
    +
    +
    +
  • @@ -97,11 +97,7 @@
    请稍等...
    - + diff --git a/len-sys/src/main/resources/ftl/system/job/jobList.ftl b/len-sys/src/main/resources/ftl/system/job/jobList.ftl index a3854f5..cd812dc 100644 --- a/len-sys/src/main/resources/ftl/system/job/jobList.ftl +++ b/len-sys/src/main/resources/ftl/system/job/jobList.ftl @@ -42,17 +42,17 @@
    <@shiro.hasPermission name="job:add"> - <@shiro.hasPermission name="job:update"> - <@shiro.hasPermission name="job:select"> - diff --git a/len-sys/src/main/resources/ftl/system/menu/menuList.ftl b/len-sys/src/main/resources/ftl/system/menu/menuList.ftl index cb8ae57..c00337d 100644 --- a/len-sys/src/main/resources/ftl/system/menu/menuList.ftl +++ b/len-sys/src/main/resources/ftl/system/menu/menuList.ftl @@ -13,10 +13,10 @@ -
    +
    <@shiro.hasPermission name="nemu:add"> - diff --git a/len-sys/src/main/resources/ftl/system/user/userList.ftl b/len-sys/src/main/resources/ftl/system/user/userList.ftl index f9d9a15..aca2dd9 100644 --- a/len-sys/src/main/resources/ftl/system/user/userList.ftl +++ b/len-sys/src/main/resources/ftl/system/user/userList.ftl @@ -12,7 +12,7 @@ + content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8"/> @@ -25,48 +25,51 @@ -
    +
    <@shiro.hasPermission name="user:select"> - <@shiro.hasPermission name="user:select"> - <@shiro.hasPermission name="user:del"> - <@shiro.hasPermission name="user:repass"> -
    -
    +
    - - - - - -
    -
    -
    -
    -
    - 业绩申报信息 -
    -
    - -
    -
    - -
    - <#----> - <#----> - -
    -
    -
    - -
    -
    - -
    - <#----> - <#----> - -
    -
    -
    - -
    -
    - 申报原因 -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    - - - - diff --git a/len-activiti/src/main/resources/ftl/act/declare/declareList.ftl b/len-activiti/src/main/resources/ftl/act/declare/declareList.ftl deleted file mode 100644 index 3bb8669..0000000 --- a/len-activiti/src/main/resources/ftl/act/declare/declareList.ftl +++ /dev/null @@ -1,256 +0,0 @@ -<#-- Created by IntelliJ IDEA. - User: zxm - Date: 2018/1/15 - Time: 16:53 - To change this template use File | Settings | File Templates. -流程部署--> - - - - - 业绩申报流程 - - - - - - - - - - - - -
    -
    - -
    -
    - -
    - - - - - - diff --git a/len-activiti/src/main/resources/ftl/act/declare/update-declare-readonly.ftl b/len-activiti/src/main/resources/ftl/act/declare/update-declare-readonly.ftl deleted file mode 100644 index 594d80d..0000000 --- a/len-activiti/src/main/resources/ftl/act/declare/update-declare-readonly.ftl +++ /dev/null @@ -1,165 +0,0 @@ -<#--Created by IntelliJ IDEA. -User: zxm -Date: 2017/12/20 -Time: 10:00 -To change this template use File | Settings | File Templates.--> - - - - - - - 业绩申报查看 - - - - - - - - - - - -
    -
    -
    -
    -
    - 业绩申报信息 -
    -
    - -
    -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    - 申报原因 -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    - <#--
    --> - <#--
    --> - <#----> - <#----> - <#----> - <#--
    --> - <#--
    --> -
    -
    - - - - diff --git a/len-activiti/src/main/resources/ftl/act/declare/update-declare.ftl b/len-activiti/src/main/resources/ftl/act/declare/update-declare.ftl deleted file mode 100644 index f354f6d..0000000 --- a/len-activiti/src/main/resources/ftl/act/declare/update-declare.ftl +++ /dev/null @@ -1,165 +0,0 @@ -<#--Created by IntelliJ IDEA. -User: zxm -Date: 2017/12/20 -Time: 10:00 -To change this template use File | Settings | File Templates.--> - - - - - - - 业绩申报查看 - - - - - - - - - - - -
    -
    -
    -
    -
    - 业绩申报信息 -
    -
    - -
    -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    - 申报原因 -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    - - - - diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index 9651cd0..0af8f80 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -48,7 +48,7 @@
    -
    +
    diff --git a/len-activiti/src/main/resources/ftl/actModelList.ftl b/len-activiti/src/main/resources/ftl/actModelList.ftl index 7bf4758..3026a0b 100644 --- a/len-activiti/src/main/resources/ftl/actModelList.ftl +++ b/len-activiti/src/main/resources/ftl/actModelList.ftl @@ -54,7 +54,7 @@
    -
    +
    + + \ No newline at end of file diff --git a/len-sys/src/main/resources/ftl/system/job/jobList.ftl b/len-sys/src/main/resources/ftl/system/job/jobList.ftl index cd812dc..5d3e637 100644 --- a/len-sys/src/main/resources/ftl/system/job/jobList.ftl +++ b/len-sys/src/main/resources/ftl/system/job/jobList.ftl @@ -8,15 +8,7 @@ 任务管理 - - - - - - - +<#include "/system/base/header.ftl"> @@ -30,35 +22,32 @@
    - -
    - +
    + + +
    -
    +
    <@shiro.hasPermission name="job:add"> - <@shiro.hasPermission name="job:update"> - <@shiro.hasPermission name="job:select"> -
    -
    +
    - +<#include "/system/base/header.ftl"> -
    +
    <@shiro.hasPermission name="control:del"> -
    -
    +
    - +<#include "/system/base/header.ftl"> diff --git a/len-sys/src/main/resources/ftl/system/menu/menuList.ftl b/len-sys/src/main/resources/ftl/system/menu/menuList.ftl index c00337d..e1a4d39 100644 --- a/len-sys/src/main/resources/ftl/system/menu/menuList.ftl +++ b/len-sys/src/main/resources/ftl/system/menu/menuList.ftl @@ -3,14 +3,8 @@ - - - - - - - +<#include "/system/base/header.ftl">
    diff --git a/len-sys/src/main/resources/ftl/system/menu/update-menu.ftl b/len-sys/src/main/resources/ftl/system/menu/update-menu.ftl index 19cdbc7..404b0bb 100644 --- a/len-sys/src/main/resources/ftl/system/menu/update-menu.ftl +++ b/len-sys/src/main/resources/ftl/system/menu/update-menu.ftl @@ -10,12 +10,7 @@ To change this template use File | Settings | File Templates.--> 菜单管理 - - - - - - +<#include "/system/base/header.ftl"> diff --git a/len-sys/src/main/resources/ftl/system/person/me.ftl b/len-sys/src/main/resources/ftl/system/person/me.ftl index 5c336c3..58751e2 100644 --- a/len-sys/src/main/resources/ftl/system/person/me.ftl +++ b/len-sys/src/main/resources/ftl/system/person/me.ftl @@ -1,12 +1,9 @@ - +!DOCTYPE html> 个人信息 - - - - +<#include "/system/base/header.ftl"> @@ -23,8 +20,9 @@
    -
    - +
    +
    @@ -40,7 +38,7 @@
    -
    @@ -53,7 +51,8 @@ *真实姓名
    - +
    @@ -71,12 +70,12 @@ 邮箱
    -
    - + 更新 @@ -84,57 +83,57 @@ - - - +<#include "/system/base/header.ftl"> -
    +
    <@shiro.hasPermission name="role:add"> - <#--<@shiro.hasPermission name="role:update">--> - <#-- --> <@shiro.hasPermission name="role:select"> -
    -
    +
    - - - - +<#include "/system/base/header.ftl"> diff --git a/len-sys/src/main/resources/ftl/system/user/re-pass.ftl b/len-sys/src/main/resources/ftl/system/user/re-pass.ftl index e89f6b1..8242b41 100644 --- a/len-sys/src/main/resources/ftl/system/user/re-pass.ftl +++ b/len-sys/src/main/resources/ftl/system/user/re-pass.ftl @@ -10,12 +10,7 @@ To change this template use File | Settings | File Templates.--> 重置密码 - - - - - - +<#include "/system/base/header.ftl"> diff --git a/len-sys/src/main/resources/ftl/system/user/update-user.ftl b/len-sys/src/main/resources/ftl/system/user/update-user.ftl index f0b73bd..f999d6f 100644 --- a/len-sys/src/main/resources/ftl/system/user/update-user.ftl +++ b/len-sys/src/main/resources/ftl/system/user/update-user.ftl @@ -10,13 +10,7 @@ To change this template use File | Settings | File Templates.--> 用户管理 - - - - - - - +<#include "/system/base/header.ftl"> - - - + + 用户管理 +<#include "/system/base/header.ftl"> -
    - diff --git a/len-sys/src/main/resources/plugin/lenos/main.css b/len-sys/src/main/resources/plugin/lenos/main.css index 806c2ee..a36a421 100644 --- a/len-sys/src/main/resources/plugin/lenos/main.css +++ b/len-sys/src/main/resources/plugin/lenos/main.css @@ -15,6 +15,7 @@ .layui-col-md12{ height:34px; + padding-top:4px; margin-top:4px; border-top: 1px solid #e5e5e5; } -- Gitee From a34f686180a93c1bfcffb3301517829f569dd8d5 Mon Sep 17 00:00:00 2001 From: art Date: Thu, 24 Oct 2019 14:25:22 +0800 Subject: [PATCH 09/39] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/ftl/act/leave/leaveList.ftl | 402 +++++++++-------- .../resources/ftl/act/leave/shinePics.ftl | 82 ++-- .../main/resources/ftl/act/task/taskList.ftl | 57 +-- .../src/main/resources/ftl/actList.ftl | 328 +++++++------- .../src/main/resources/ftl/actModelList.ftl | 404 +++++++++--------- .../main/resources/ftl/system/job/jobList.ftl | 2 +- .../main/resources/ftl/system/log/logList.ftl | 2 +- .../resources/ftl/system/menu/menuList.ftl | 7 +- .../resources/ftl/system/role/roleList.ftl | 2 +- .../resources/ftl/system/user/userList.ftl | 3 +- .../plugin/build/css/themes/default.css | 2 + .../src/main/resources/plugin/lenos/main.css | 8 +- 12 files changed, 614 insertions(+), 685 deletions(-) diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index 0af8f80..84dfb28 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -7,242 +7,240 @@ - - 请假流程示例 - - - - - - - - + + 请假流程示例 +<#include "/system/base/header.ftl">
  • ":'
  • '+(e-7+t)+"年
  • "}),t("#laydate_ys").innerHTML=n,i.each(t("#laydate_ys li"),function(e,t){"y"===i.checkVoid(t.getAttribute("y"))[0]?i.addClass(t,s[1]):i.on(t,"click",function(e){i.stopmp(e).reshow(),i.viewDate(0|this.getAttribute("y"),i.ymd[1],i.ymd[2])})})},i.initDate=function(){var e=(i.query,new Date),t=i.elem[s.elemv].match(/\d+/g)||[];t.length<3&&(t=i.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),i.inymd=t,i.viewDate(t[0],t[1]-1,t[2])},i.iswrite=function(){var e=i.query,t={time:e("#laydate_hms")};i.shde(t.time,!i.options.istime),i.shde(s.oclear,!("isclear"in i.options?i.options.isclear:1)),i.shde(s.otoday,!("istoday"in i.options?i.options.istoday:1)),i.shde(s.ok,!("issure"in i.options?i.options.issure:1))},i.orien=function(e,t){var n,a=i.elem.getBoundingClientRect();e.style.left=a.left+(t?0:i.scroll(1))+"px",n=a.bottom+e.offsetHeight/1.5<=i.winarea()?a.bottom-1:a.top>e.offsetHeight/1.5?a.top-e.offsetHeight+1:i.winarea()-e.offsetHeight,e.style.top=Math.max(n+(t?0:i.scroll()),1)+"px"},i.follow=function(e){i.options.fixed?(e.style.position="fixed",i.orien(e,1)):(e.style.position="absolute",i.orien(e))},i.viewtb=function(){var e,t=[],n=["日","一","二","三","四","五","六"],o={},s=a[r]("table"),u=a[r]("thead");return u.appendChild(a[r]("tr")),o.creath=function(e){var t=a[r]("th");t.innerHTML=n[e],u[l]("tr")[0].appendChild(t),t=null},i.each(new Array(6),function(n){t.push([]),e=s.insertRow(0),i.each(new Array(7),function(i){t[n][i]=0,0===n&&o.creath(i),e.insertCell(i)})}),s.insertBefore(u,s.children[0]),s.id=s.className="laydate_table",e=t=null,s.outerHTML.toLowerCase()}(),i.view=function(e,t){var o,l=i.query,u={};t=t||e,i.elem=e,i.options=t,i.options.format||(i.options.format=n.format),i.options.start=i.options.start||"",i.mm=u.mm=[i.options.min||n.min,i.options.max||n.max],i.mins=u.mm[0].match(/\d+/g),i.maxs=u.mm[1].match(/\d+/g),i.box?i.shde(i.box):(o=a[r]("div"),o.id=s[0],o.className=s[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=u.html='
      '+function(){var e="";return i.each(new Array(12),function(t){e+=''+i.digit(t+1)+"月"}),e}()+"
      "+i.viewtb+'",a.body.appendChild(o),i.box=l("#"+s[0]),i.events(),o=null),i.follow(i.box),t.zIndex?i.box.style.zIndex=t.zIndex:i.removeCssAttr(i.box,"z-index"),i.stopMosup("click",i.box),i.initDate(),i.iswrite(),i.check()},i.reshow=function(){return i.each(i.query("#"+s[0]+" .laydate_show"),function(e,t){i.removeClass(t,"laydate_show")}),this},i.close=function(){i.reshow(),i.shde(i.query("#"+s[0]),1),i.elem=null},i.parse=function(e,t,a){return e=e.concat(t),a=a||(i.options?i.options.format:n.format),a.replace(/YYYY|MM|DD|hh|mm|ss/g,function(){return e.index=0|++e.index,i.digit(e[e.index])})},i.creation=function(e,t){var n=(i.query,i.hmsin),a=i.parse(e,[n[0].value,n[1].value,n[2].value]);i.elem[s.elemv]=a,t||(i.close(),"function"==typeof i.options.choose&&i.options.choose(a))},i.events=function(){var e=i.query,n={box:"#"+s[0]};i.addClass(a.body,"laydate_body"),s.tds=e("#laydate_table td"),s.mms=e("#laydate_ms span"),s.year=e("#laydate_y"),s.month=e("#laydate_m"),i.each(e(n.box+" .laydate_ym"),function(e,t){i.on(t,"click",function(t){i.stopmp(t).reshow(),i.addClass(this[l]("div")[0],"laydate_show"),e||(n.YY=parseInt(s.year.value),i.viewYears(n.YY))})}),i.on(e(n.box),"click",function(){i.reshow()}),n.tabYear=function(e){0===e?i.ymd[0]--:1===e?i.ymd[0]++:2===e?n.YY-=14:n.YY+=14,2>e?(i.viewDate(i.ymd[0],i.ymd[1],i.ymd[2]),i.reshow()):i.viewYears(n.YY)},i.each(e("#laydate_YY .laydate_tab"),function(e,t){i.on(t,"click",function(t){i.stopmp(t),n.tabYear(e)})}),n.tabMonth=function(e){e?(i.ymd[1]++,12===i.ymd[1]&&(i.ymd[0]++,i.ymd[1]=0)):(i.ymd[1]--,-1===i.ymd[1]&&(i.ymd[0]--,i.ymd[1]=11)),i.viewDate(i.ymd[0],i.ymd[1],i.ymd[2])},i.each(e("#laydate_MM .laydate_tab"),function(e,t){i.on(t,"click",function(t){i.stopmp(t).reshow(),n.tabMonth(e)})}),i.each(e("#laydate_ms span"),function(e,t){i.on(t,"click",function(e){i.stopmp(e).reshow(),i.hasClass(this,s[1])||i.viewDate(i.ymd[0],0|this.getAttribute("m"),i.ymd[2])})}),i.each(e("#laydate_table td"),function(e,t){i.on(t,"click",function(e){i.hasClass(this,s[1])||(i.stopmp(e),i.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),s.oclear=e("#laydate_clear"),i.on(s.oclear,"click",function(){i.elem[s.elemv]="",i.close()}),s.otoday=e("#laydate_today"),i.on(s.otoday,"click",function(){var e=new Date;i.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),s.ok=e("#laydate_ok"),i.on(s.ok,"click",function(){i.valid&&i.creation([i.ymd[0],i.ymd[1]+1,i.ymd[2]])}),n.times=e("#laydate_time"),i.hmsin=n.hmsin=e("#laydate_hms input"),n.hmss=["小时","分钟","秒数"],n.hmsarr=[],i.msg=function(t,a){var r='
      '+(a||"提示")+"×
      ";"string"==typeof t?(r+="

      "+t+"

      ",i.shde(e("#"+s[0])),i.removeClass(n.times,"laydate_time1").addClass(n.times,"laydate_msg")):(n.hmsarr[t]?r=n.hmsarr[t]:(r+='
      ',i.each(new Array(0===t?24:60),function(e){r+=""+e+""}),r+="
      ",n.hmsarr[t]=r),i.removeClass(n.times,"laydate_msg"),i[0===t?"removeClass":"addClass"](n.times,"laydate_time1")),i.addClass(n.times,"laydate_show"),n.times.innerHTML=r},n.hmson=function(t,n){var a=e("#laydate_hmsno span"),r=i.valid?null:1;i.each(a,function(e,a){r?i.addClass(a,s[1]):i.timeVoid(e,n)?i.addClass(a,s[1]):i.on(a,"click",function(){i.hasClass(this,s[1])||(t.value=i.digit(0|this.innerHTML))})}),i.addClass(a[0|t.value],"laydate_click")},i.each(n.hmsin,function(e,t){i.on(t,"click",function(t){i.stopmp(t).reshow(),i.msg(e,n.hmss[e]),n.hmson(this,e)})}),i.on(a,"mouseup",function(){var t=e("#"+s[0]);t&&"none"!==t.style.display&&(i.check()||i.close())}).on(a,"keydown",function(e){e=e||t.event;var n=e.keyCode;13===n&&i.elem&&i.creation([i.ymd[0],i.ymd[1]+1,i.ymd[2]])})},laydate.reset=function(){i.box&&i.elem&&i.follow(i.box)},laydate.now=function(e,t){var n=new Date(0|e?function(e){return 864e5>e?+new Date+864e5*e:e}(parseInt(e)):+new Date);return i.parse([n.getFullYear(),n.getMonth()+1,n.getDate()],[n.getHours(),n.getMinutes(),n.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)}),!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e){function t(e){var t=!!e&&"length"in e&&e.length,n=ft.type(e);return"function"!==n&&!ft.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function n(e,t,n){if(ft.isFunction(t))return ft.grep(e,function(e,i){return!!t.call(e,i,e)!==n});if(t.nodeType)return ft.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(kt.test(t))return ft.filter(t,e,n);t=ft.filter(t,e)}return ft.grep(e,function(e){return ft.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function a(e){var t={};return ft.each(e.match(Lt)||[],function(e,n){t[n]=!0}),t}function r(){nt.addEventListener?(nt.removeEventListener("DOMContentLoaded",o),e.removeEventListener("load",o)):(nt.detachEvent("onreadystatechange",o),e.detachEvent("onload",o))}function o(){(nt.addEventListener||"load"===e.event.type||"complete"===nt.readyState)&&(r(),ft.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var i="data-"+t.replace(Ht,"-$1").toLowerCase();if(n=e.getAttribute(i),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:_t.test(n)?ft.parseJSON(n):n)}catch(a){}ft.data(e,t,n)}else n=void 0}return n}function s(e){var t;for(t in e)if(("data"!==t||!ft.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,i){if(Dt(e)){var a,r,o=ft.expando,l=e.nodeType,s=l?ft.cache:e,u=l?e[o]:e[o]&&o;if(u&&s[u]&&(i||s[u].data)||void 0!==n||"string"!=typeof t)return u||(u=l?e[o]=tt.pop()||ft.guid++:o),s[u]||(s[u]=l?{}:{toJSON:ft.noop}),"object"!=typeof t&&"function"!=typeof t||(i?s[u]=ft.extend(s[u],t):s[u].data=ft.extend(s[u].data,t)),r=s[u],i||(r.data||(r.data={}),r=r.data),void 0!==n&&(r[ft.camelCase(t)]=n),"string"==typeof t?(a=r[t],null==a&&(a=r[ft.camelCase(t)])):a=r,a}}function c(e,t,n){if(Dt(e)){var i,a,r=e.nodeType,o=r?ft.cache:e,l=r?e[ft.expando]:ft.expando;if(o[l]){if(t&&(i=n?o[l]:o[l].data)){ft.isArray(t)?t=t.concat(ft.map(t,ft.camelCase)):t in i?t=[t]:(t=ft.camelCase(t),t=t in i?[t]:t.split(" ")),a=t.length;for(;a--;)delete i[t[a]];if(n?!s(i):!ft.isEmptyObject(i))return}(n||(delete o[l].data,s(o[l])))&&(r?ft.cleanData([e],!0):ct.deleteExpando||o!=o.window?delete o[l]:o[l]=void 0)}}}function d(e,t,n,i){var a,r=1,o=20,l=i?function(){return i.cur()}:function(){return ft.css(e,t,"")},s=l(),u=n&&n[3]||(ft.cssNumber[t]?"":"px"),c=(ft.cssNumber[t]||"px"!==u&&+s)&&Ft.exec(ft.css(e,t));if(c&&c[3]!==u){u=u||c[3],n=n||[],c=+s||1;do r=r||".5",c/=r,ft.style(e,t,c+u);while(r!==(r=l()/s)&&1!==r&&--o)}return n&&(c=+c||+s||0,a=n[1]?c+(n[1]+1)*n[2]:+n[2],i&&(i.unit=u,i.start=c,i.end=a)),a}function f(e){var t=Wt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function p(e,t){var n,i,a=0,r="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!r)for(r=[],n=e.childNodes||e;null!=(i=n[a]);a++)!t||ft.nodeName(i,t)?r.push(i):ft.merge(r,p(i,t));return void 0===t||t&&ft.nodeName(e,t)?ft.merge([e],r):r}function h(e,t){for(var n,i=0;null!=(n=e[i]);i++)ft._data(n,"globalEval",!t||ft._data(t[i],"globalEval"))}function y(e){Bt.test(e.type)&&(e.defaultChecked=e.checked)}function m(e,t,n,i,a){for(var r,o,l,s,u,c,d,m=e.length,v=f(t),g=[],b=0;m>b;b++)if(o=e[b],o||0===o)if("object"===ft.type(o))ft.merge(g,o.nodeType?[o]:o);else if(Yt.test(o)){for(s=s||v.appendChild(t.createElement("div")),u=(zt.exec(o)||["",""])[1].toLowerCase(),d=$t[u]||$t._default,s.innerHTML=d[1]+ft.htmlPrefilter(o)+d[2],r=d[0];r--;)s=s.lastChild;if(!ct.leadingWhitespace&&Pt.test(o)&&g.push(t.createTextNode(Pt.exec(o)[0])),!ct.tbody)for(o="table"!==u||Xt.test(o)?""!==d[1]||Xt.test(o)?0:s:s.firstChild,r=o&&o.childNodes.length;r--;)ft.nodeName(c=o.childNodes[r],"tbody")&&!c.childNodes.length&&o.removeChild(c);for(ft.merge(g,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=v.lastChild}else g.push(t.createTextNode(o));for(s&&v.removeChild(s),ct.appendChecked||ft.grep(p(g,"input"),y),b=0;o=g[b++];)if(i&&ft.inArray(o,i)>-1)a&&a.push(o);else if(l=ft.contains(o.ownerDocument,o),s=p(v.appendChild(o),"script"),l&&h(s),n)for(r=0;o=s[r++];)Rt.test(o.type||"")&&n.push(o);return s=null,v}function v(){return!0}function g(){return!1}function b(){try{return nt.activeElement}catch(e){}}function x(e,t,n,i,a,r){var o,l;if("object"==typeof t){"string"!=typeof n&&(i=i||n,n=void 0);for(l in t)x(e,l,n,i,t[l],r);return e}if(null==i&&null==a?(a=n,i=n=void 0):null==a&&("string"==typeof n?(a=i,i=void 0):(a=i,i=n,n=void 0)),a===!1)a=g;else if(!a)return e;return 1===r&&(o=a,a=function(e){return ft().off(e),o.apply(this,arguments)},a.guid=o.guid||(o.guid=ft.guid++)),e.each(function(){ft.event.add(this,t,a,i,n)})}function w(e,t){return ft.nodeName(e,"table")&&ft.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function k(e){return e.type=(null!==ft.find.attr(e,"type"))+"/"+e.type,e}function C(e){var t=an.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function T(e,t){if(1===t.nodeType&&ft.hasData(e)){var n,i,a,r=ft._data(e),o=ft._data(t,r),l=r.events;if(l){delete o.handle,o.events={};for(n in l)for(i=0,a=l[n].length;a>i;i++)ft.event.add(t,n,l[n][i])}o.data&&(o.data=ft.extend({},o.data))}}function E(e,t){var n,i,a;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!ct.noCloneEvent&&t[ft.expando]){a=ft._data(t);for(i in a.events)ft.removeEvent(t,i,a.handle);t.removeAttribute(ft.expando)}"script"===n&&t.text!==e.text?(k(t).text=e.text,C(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),ct.html5Clone&&e.innerHTML&&!ft.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Bt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}}function N(e,t,n,i){t=at.apply([],t);var a,r,o,l,s,u,c=0,d=e.length,f=d-1,h=t[0],y=ft.isFunction(h);if(y||d>1&&"string"==typeof h&&!ct.checkClone&&nn.test(h))return e.each(function(a){var r=e.eq(a);y&&(t[0]=h.call(this,a,r.html())),N(r,t,n,i)});if(d&&(u=m(t,e[0].ownerDocument,!1,e,i),a=u.firstChild,1===u.childNodes.length&&(u=a),a||i)){for(l=ft.map(p(u,"script"),k),o=l.length;d>c;c++)r=u,c!==f&&(r=ft.clone(r,!0,!0),o&&ft.merge(l,p(r,"script"))),n.call(e[c],r,c);if(o)for(s=l[l.length-1].ownerDocument,ft.map(l,C),c=0;o>c;c++)r=l[c],Rt.test(r.type||"")&&!ft._data(r,"globalEval")&&ft.contains(s,r)&&(r.src?ft._evalUrl&&ft._evalUrl(r.src):ft.globalEval((r.text||r.textContent||r.innerHTML||"").replace(rn,"")));u=a=null}return e}function A(e,t,n){for(var i,a=t?ft.filter(t,e):e,r=0;null!=(i=a[r]);r++)n||1!==i.nodeType||ft.cleanData(p(i)),i.parentNode&&(n&&ft.contains(i.ownerDocument,i)&&h(p(i,"script")),i.parentNode.removeChild(i));return e}function L(e,t){var n=ft(t.createElement(e)).appendTo(t.body),i=ft.css(n[0],"display");return n.detach(),i}function S(e){var t=nt,n=un[e];return n||(n=L(e,t),"none"!==n&&n||(sn=(sn||ft("';break;case 3:delete t.title,delete t.closeBtn,-1===t.icon&&0===t.icon,o.closeAll("loading");break;case 4:u||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||o.closeAll("tips")}e.vessel(u,function(i,o,d){c.append(i[0]),u?function(){2==t.type||4==t.type?function(){n("body").append(i[1])}():function(){l.parents("."+s[0])[0]||(l.data("display",l.css("display")).show().addClass("layui-layer-wrap").wrap(i[1]),n("#"+s[0]+a).find("."+s[5]).before(o))}()}():c.append(i[1]),n(".layui-layer-move")[0]||c.append(r.moveElem=d),e.layero=n("#"+s[0]+a),t.scrollbar||s.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==o.ie&&e.layero.find("iframe").attr("src",l[0]),4==t.type?e.tips():e.offset(),t.fixed&&i.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){o.close(e.index)},t.time),e.move().callback(),s.anim[t.anim]&&e.layero.addClass(s.anim[t.anim]),t.isOutAnim&&e.layero.data("isOutAnim",!0)}},l.pt.auto=function(e){function t(e){e=l.find(e),e.height(u[1]-c-d-2*(0|parseFloat(e.css("padding-top"))))}var a=this,r=a.config,l=n("#"+s[0]+e);""===r.area[0]&&r.maxWidth>0&&(o.ie&&o.ie<8&&r.btn&&l.width(l.innerWidth()),l.outerWidth()>r.maxWidth&&l.width(r.maxWidth));var u=[l.innerWidth(),l.innerHeight()],c=l.find(s[1]).outerHeight()||0,d=l.find("."+s[6]).outerHeight()||0;switch(r.type){case 2:t("iframe");break;default:""===r.area[1]?r.fixed&&u[1]>=i.height()&&(u[1]=i.height(),t("."+s[5])):t("."+s[5]) -}return a},l.pt.offset=function(){var e=this,t=e.config,n=e.layero,a=[n.outerWidth(),n.outerHeight()],r="object"==typeof t.offset;e.offsetTop=(i.height()-a[1])/2,e.offsetLeft=(i.width()-a[0])/2,r?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=i.width()-a[0]:"b"===t.offset?e.offsetTop=i.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=i.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=i.width()-a[0]):"rb"===t.offset?(e.offsetTop=i.height()-a[1],e.offsetLeft=i.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?i.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?i.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=i.scrollTop(),e.offsetLeft+=i.scrollLeft()),n.attr("minLeft")&&(e.offsetTop=i.height()-(n.find(s[1]).outerHeight()||0),e.offsetLeft=n.css("left")),n.css({top:e.offsetTop,left:e.offsetLeft})},l.pt.tips=function(){var e=this,t=e.config,a=e.layero,r=[a.outerWidth(),a.outerHeight()],o=n(t.follow);o[0]||(o=n("body"));var l={width:o.outerWidth(),height:o.outerHeight(),top:o.offset().top,left:o.offset().left},u=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||u.remove(),l.autoLeft=function(){l.left+r[0]-i.width()>0?(l.tipLeft=l.left+l.width-r[0],u.css({right:12,left:"auto"})):l.tipLeft=l.left},l.where=[function(){l.autoLeft(),l.tipTop=l.top-r[1]-10,u.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){l.tipLeft=l.left+l.width+10,l.tipTop=l.top,u.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){l.autoLeft(),l.tipTop=l.top+l.height+10,u.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){l.tipLeft=l.left-r[0]-10,l.tipTop=l.top,u.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],l.where[c-1](),1===c?l.top-(i.scrollTop()+r[1]+16)<0&&l.where[2]():2===c?i.width()-(l.left+l.width+r[0]+16)>0||l.where[3]():3===c?l.top-i.scrollTop()+l.height+r[1]+16-i.height()>0&&l.where[0]():4===c&&r[0]+16-l.left>0&&l.where[1](),a.find("."+s[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:l.tipLeft-(t.fixed?i.scrollLeft():0),top:l.tipTop-(t.fixed?i.scrollTop():0)})},l.pt.move=function(){var e=this,t=e.config,a=n(document),l=e.layero,s=l.find(t.move),u=l.find(".layui-layer-resize"),c={};return t.move&&s.css("cursor","move"),s.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(l.css("left")),e.clientY-parseFloat(l.css("top"))],r.moveElem.css("cursor","move").show())}),u.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[l.outerWidth(),l.outerHeight()],r.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(n){if(c.moveStart){var a=n.clientX-c.offset[0],r=n.clientY-c.offset[1],s="fixed"===l.css("position");if(n.preventDefault(),c.stX=s?0:i.scrollLeft(),c.stY=s?0:i.scrollTop(),!t.moveOut){var u=i.width()-l.outerWidth()+c.stX,d=i.height()-l.outerHeight()+c.stY;au&&(a=u),rd&&(r=d)}l.css({left:a,top:r})}if(t.resize&&c.resizeStart){var a=n.clientX-c.offset[0],r=n.clientY-c.offset[1];n.preventDefault(),o.style(e.index,{width:c.area[0]+a,height:c.area[1]+r}),c.isResize=!0,t.resizing&&t.resizing(l)}}).on("mouseup",function(){c.moveStart&&(delete c.moveStart,r.moveElem.hide(),t.moveEnd&&t.moveEnd(l)),c.resizeStart&&(delete c.resizeStart,r.moveElem.hide())}),e},l.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,i);e===!1||o.close(t.index)}var t=this,i=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?i.find("iframe").on("load",function(){a.success(i,t.index)}):a.success(i,t.index)),6==o.ie&&t.IE6(i),i.find("."+s[6]).children("a").on("click",function(){var e=n(this).index();if(0===e)a.yes?a.yes(t.index,i):a.btn1?a.btn1(t.index,i):o.close(t.index);else{var r=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,i);r===!1||o.close(t.index)}}),i.find("."+s[7]).on("click",e),a.shadeClose&&n("#layui-layer-shade"+t.index).on("click",function(){o.close(t.index)}),i.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(i);e===!1||o.min(t.index,a)}),i.find(".layui-layer-max").on("click",function(){n(this).hasClass("layui-layer-maxmin")?(o.restore(t.index),a.restore&&a.restore(i)):(o.full(t.index,a),setTimeout(function(){a.full&&a.full(i)},100))}),a.end&&(r.end[t.index]=a.end)},r.reselect=function(){n.each(n("select"),function(){var e=n(this);e.parents("."+s[0])[0]||1==e.attr("layer")&&n("."+s[0]).length<1&&e.removeAttr("layer").show(),e=null})},l.pt.IE6=function(){n("select").each(function(){var e=n(this);e.parents("."+s[0])[0]||"none"===e.css("display")||e.attr({layer:"1"}).hide(),e=null})},l.pt.openLayer=function(){var e=this;o.zIndex=e.config.zIndex,o.setTop=function(e){var t=function(){o.zIndex++,e.css("z-index",o.zIndex+1)};return o.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),o.zIndex}},r.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},r.rescollbar=function(e){s.html.attr("layer-full")==e&&(s.html[0].style.removeProperty?s.html[0].style.removeProperty("overflow"):s.html[0].style.removeAttribute("overflow"),s.html.removeAttr("layer-full"))},e.layer=o,o.getChildFrame=function(e,t){return t=t||n("."+s[4]).attr("times"),n("#"+s[0]+t).find("iframe").contents().find(e)},o.getFrameIndex=function(e){return n("#"+e).parents("."+s[4]).attr("times")},o.iframeAuto=function(e){if(e){var t=o.getChildFrame("html",e).outerHeight(),i=n("#"+s[0]+e),a=i.find(s[1]).outerHeight()||0,r=i.find("."+s[6]).outerHeight()||0;i.css({height:t+a+r}),i.find("iframe").css({height:t})}},o.iframeSrc=function(e,t){n("#"+s[0]+e).find("iframe").attr("src",t)},o.style=function(e,t,i){var a=n("#"+s[0]+e),o=a.find(".layui-layer-content"),l=a.attr("type"),u=a.find(s[1]).outerHeight()||0,c=a.find("."+s[6]).outerHeight()||0;a.attr("minLeft"),l!==r.type[3]&&l!==r.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-u-c<=64&&(t.height=64+u+c)),a.css(t),c=a.find("."+s[6]).outerHeight(),l===r.type[2]?a.find("iframe").css({height:parseFloat(t.height)-u-c}):o.css({height:parseFloat(t.height)-u-c-parseFloat(o.css("padding-top"))-parseFloat(o.css("padding-bottom"))}))},o.min=function(e){var t=n("#"+s[0]+e),a=t.find(s[1]).outerHeight()||0,l=t.attr("minLeft")||181*r.minIndex+"px",u=t.css("position");r.record(t),r.minLeft[0]&&(l=r.minLeft[0],r.minLeft.shift()),t.attr("position",u),o.style(e,{width:180,height:a,left:l,top:i.height()-a,position:"fixed",overflow:"hidden"},!0),t.find(".layui-layer-min").hide(),"page"===t.attr("type")&&t.find(s[4]).hide(),r.rescollbar(e),t.attr("minLeft")||r.minIndex++,t.attr("minLeft",l)},o.restore=function(e){var t=n("#"+s[0]+e),i=t.attr("area").split(",");t.attr("type"),o.style(e,{width:parseFloat(i[0]),height:parseFloat(i[1]),top:parseFloat(i[2]),left:parseFloat(i[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(s[4]).show(),r.rescollbar(e)},o.full=function(e){var t,a=n("#"+s[0]+e);r.record(a),s.html.attr("layer-full")||s.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");o.style(e,{top:t?0:i.scrollTop(),left:t?0:i.scrollLeft(),width:i.width(),height:i.height()},!0),a.find(".layui-layer-min").hide()},100)},o.title=function(e,t){var i=n("#"+s[0]+(t||o.index)).find(s[1]);i.html(e)},o.close=function(e){var t=n("#"+s[0]+e),i=t.attr("type"),a="layer-anim-close";if(t[0]){var l="layui-layer-wrap",u=function(){if(i===r.type[1]&&"object"===t.attr("conType")){t.children(":not(."+s[5]+")").remove();for(var a=t.find("."+l),o=0;2>o;o++)a.unwrap();a.css("display",a.data("display")).removeClass(l)}else{if(i===r.type[2])try{var u=n("#"+s[4]+e)[0];u.contentWindow.document.write(""),u.contentWindow.close(),t.find("."+s[5])[0].removeChild(u)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof r.end[e]&&r.end[e](),delete r.end[e]};t.data("isOutAnim")&&t.addClass(a),n("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==o.ie&&r.reselect(),r.rescollbar(e),t.attr("minLeft")&&(r.minIndex--,r.minLeft.push(t.attr("minLeft"))),o.ie&&o.ie<10||!t.data("isOutAnim")?u():setTimeout(function(){u()},200)}},o.closeAll=function(e){n.each(n("."+s[0]),function(){var t=n(this),i=e?t.attr("type")===e:1;i&&o.close(t.attr("times")),i=null})};var u=o.cache||{},c=function(e){return u.skin?" "+u.skin+" "+u.skin+"-"+e:""};o.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var r=e.area;a='style="width: '+r[0]+"; height: "+r[1]+';"',delete e.area}var l,s=2==e.formType?'":function(){return''}(),u=e.success;return delete e.success,o.open(n.extend({type:1,btn:["确定","取消"],content:s,skin:"layui-layer-prompt"+c("prompt"),maxWidth:i.width(),success:function(e){l=e.find(".layui-layer-input"),l.focus(),"function"==typeof u&&u(e)},resize:!1,yes:function(n){var i=l.val();""===i?l.focus():i.length>(e.maxlength||500)?o.tips("最多输入"+(e.maxlength||500)+"个字数",l,{tips:1}):t&&t(i,n,l)}},e))},o.tab=function(e){e=e||{};var t=e.tab||{},i=e.success;return delete e.success,o.open(n.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,n=1,i="";if(e>0)for(i=''+t[0].title+"";e>n;n++)i+=""+t[n].title+"";return i}(),content:'
        '+function(){var e=t.length,n=1,i="";if(e>0)for(i='
      • '+(t[0].content||"no content")+"
      • ";e>n;n++)i+='
      • '+(t[n].content||"no content")+"
      • ";return i}()+"
      ",success:function(t){var a=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var i=n(this),a=i.index();i.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),r.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof i&&i(t)}},e))},o.photos=function(t,i,a){function r(e,t,n){var i=new Image;return i.src=e,i.complete?t(i):(i.onload=function(){i.onload=null,t(i)},void(i.onerror=function(e){i.onerror=null,n(e)}))}var l={};if(t=t||{},t.photos){var s=t.photos.constructor===Object,u=s?t.photos:{},d=u.data||[],f=u.start||0;l.imgIndex=(0|f)+1,t.img=t.img||"img";var p=t.success;if(delete t.success,s){if(0===d.length)return o.msg("没有图片")}else{var h=n(t.photos),y=function(){d=[],h.find(t.img).each(function(e){var t=n(this);t.attr("layer-index",e),d.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(y(),0===d.length)return;if(i||h.on("click",t.img,function(){var e=n(this),i=e.attr("layer-index");o.photos(n.extend(t,{photos:{start:i,data:d,tab:t.tab},full:t.full}),!0),y()}),!i)return}l.imgprev=function(e){l.imgIndex--,l.imgIndex<1&&(l.imgIndex=d.length),l.tabimg(e)},l.imgnext=function(e,t){l.imgIndex++,l.imgIndex>d.length&&(l.imgIndex=1,t)||l.tabimg(e)},l.keyup=function(e){if(!l.end){var t=e.keyCode;e.preventDefault(),37===t?l.imgprev(!0):39===t?l.imgnext(!0):27===t&&o.close(l.index)}},l.tabimg=function(e){return d.length<=1?void 0:(u.start=l.imgIndex-1,o.close(l.index),o.photos(t,!0,e))},l.event=function(){l.bigimg.hover(function(){l.imgsee.show()},function(){l.imgsee.hide()}),l.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),l.imgprev()}),l.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),l.imgnext()}),n(document).on("keyup",l.keyup)},l.loadi=o.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),r(d[f].src,function(i){o.close(l.loadi),l.index=o.open(n.extend({type:1,id:"layui-layer-photos",area:function(){var a=[i.width,i.height],r=[n(e).width()-100,n(e).height()-100];if(!t.full&&(a[0]>r[0]||a[1]>r[1])){var o=[a[0]/r[0],a[1]/r[1]];o[0]>o[1]?(a[0]=a[0]/o[0],a[1]=a[1]/o[0]):o[0]'+(d[f].alt||
      '+(d.length>1?'':"")+'
      '+(d[f].alt||"")+""+l.imgIndex+"/"+d.length+"
      ",success:function(e){l.bigimg=e.find(".layui-layer-phimg"),l.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),l.event(e),t.tab&&t.tab(d[f],e),"function"==typeof p&&p(e)},end:function(){l.end=!0,n(document).off("keyup",l.keyup)}},t))},function(){o.close(l.loadi),o.msg("当前图片地址异常
      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){d.length>1&&l.imgnext(!0,!0)}})})}},r.run=function(t){n=t,i=n(e),s.html=n("html"),o.open=function(e){var t=new l(e);return t.index}},e.layui&&layui.define?(o.ready(),layui.define("jquery",function(t){o.path=layui.cache.dir,r.run(layui.jquery),e.layer=o,t("layer",o)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return r.run(e.jQuery),o}):function(){r.run(e.jQuery),o.ready()}()}(window),layui.define("jquery",function(e){"use strict";var t=layui.jquery,n=(layui.hint(),layui.device()),i="element",a="layui-this",r="layui-show",o=function(){this.config={}};o.prototype.set=function(e){var n=this;return t.extend(!0,n.config,e),n},o.prototype.on=function(e,t){return layui.onevent(i,e,t)},o.prototype.tabAdd=function(e,n){var i=".layui-tab-title",a=t(".layui-tab[lay-filter="+e+"]"),r=a.children(i),o=a.children(".layui-tab-content");return r.append('
    • '+(n.title||"unnaming")+"
    • "),o.append('
      '+(n.content||"")+"
      "),h.hideTabMore(!0),h.tabAuto(),this},o.prototype.tabDelete=function(e,n){var i=".layui-tab-title",a=t(".layui-tab[lay-filter="+e+"]"),r=a.children(i),o=r.find('>li[lay-id="'+n+'"]');return h.tabDelete(null,o),this},o.prototype.tabChange=function(e,n){var i=".layui-tab-title",a=t(".layui-tab[lay-filter="+e+"]"),r=a.children(i),o=r.find('>li[lay-id="'+n+'"]');return h.tabClick(null,null,o),this},o.prototype.progress=function(e,n){var i="layui-progress",a=t("."+i+"[lay-filter="+e+"]"),r=a.find("."+i+"-bar"),o=r.find("."+i+"-text");return r.css("width",n),o.text(n),this};var l=".layui-nav",s="layui-nav-item",u="layui-nav-bar",c="layui-nav-tree",d="layui-nav-child",f="layui-nav-more",p="layui-anim layui-anim-upbit",h={tabClick:function(e,n,o){var l=o||t(this),n=n||l.parent().children("li").index(l),s=l.parents(".layui-tab").eq(0),u=s.children(".layui-tab-content").children(".layui-tab-item"),c=s.attr("lay-filter");l.addClass(a).siblings().removeClass(a),u.eq(n).addClass(r).siblings().removeClass(r),layui.event.call(this,i,"tab("+c+")",{elem:s,index:n})},tabDelete:function(e,n){var i=n||t(this).parent(),r=i.index(),o=i.parents(".layui-tab").eq(0),l=o.children(".layui-tab-content").children(".layui-tab-item");i.hasClass(a)&&(i.next()[0]?h.tabClick.call(i.next()[0],null,r+1):i.prev()[0]&&h.tabClick.call(i.prev()[0],null,r-1)),i.remove(),l.eq(r).remove(),setTimeout(function(){h.tabAuto()},50)},tabAuto:function(){var e="layui-tab-more",i="layui-tab-bar",a="layui-tab-close",r=this;t(".layui-tab").each(function(){var o=t(this),l=o.children(".layui-tab-title"),s=(o.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),u=t('');if(r===window&&8!=n.ie&&h.hideTabMore(!0),o.attr("lay-allowClose")&&l.find("li").each(function(){var e=t(this);if(!e.find("."+a)[0]){var n=t('');n.on("click",h.tabDelete),e.append(n)}}),l.prop("scrollWidth")>l.outerWidth()+1){if(l.find("."+i)[0])return;l.append(u),o.attr("overflow",""),u.on("click",function(){l[this.title?"removeClass":"addClass"](e),this.title=this.title?"":"收缩"})}else l.find("."+i).remove(),o.removeAttr("overflow")})},hideTabMore:function(e){var n=t(".layui-tab-title");e!==!0&&"tabmore"===t(e.target).attr("lay-stope")||(n.removeClass("layui-tab-more"),n.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var e=t(this),n=e.parents(l),r=n.attr("lay-filter");e.find("."+d)[0]||(n.find("."+a).removeClass(a),e.addClass(a),layui.event.call(this,i,"nav("+r+")",e))},clickChild:function(){var e=t(this),n=e.parents(l),r=n.attr("lay-filter");n.find("."+a).removeClass(a),e.addClass(a),layui.event.call(this,i,"nav("+r+")",e)},showChild:function(){var e=t(this),n=e.parents(l),i=e.parent(),a=e.siblings("."+d);n.hasClass(c)&&(a.removeClass(p),i["none"===a.css("display")?"addClass":"removeClass"](s+"ed"))},collapse:function(){var e=t(this),n=e.find(".layui-colla-icon"),a=e.siblings(".layui-colla-content"),o=e.parents(".layui-collapse").eq(0),l=o.attr("lay-filter"),s="none"===a.css("display");if("string"==typeof o.attr("lay-accordion")){var u=o.children(".layui-colla-item").children("."+r);u.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),u.removeClass(r)}a[s?"addClass":"removeClass"](r),n.html(s?"":""),layui.event.call(this,i,"collapse("+l+")",{title:e,content:a,show:s})}};o.prototype.init=function(){var e={tab:function(){h.tabAuto.call({})},nav:function(){var e,i,a,o=200,y=function(l,s){var u=t(this),h=u.find("."+d);s.hasClass(c)?l.css({top:u.position().top,height:u.children("a").height(),opacity:1}):(h.addClass(p),l.css({left:u.position().left+parseFloat(u.css("marginLeft")),top:u.position().top+u.height()-5}),e=setTimeout(function(){l.css({width:u.width(),opacity:1})},n.ie&&n.ie<10?0:o),clearTimeout(a),"block"===h.css("display")&&clearTimeout(i),i=setTimeout(function(){h.addClass(r),u.find("."+f).addClass(f+"d")},300))};t(l).each(function(){var n=t(this),l=t(''),p=n.find("."+s);n.find("."+u)[0]||(n.append(l),p.on("mouseenter",function(){y.call(this,l,n)}).on("mouseleave",function(){n.hasClass(c)||(clearTimeout(i),i=setTimeout(function(){n.find("."+d).removeClass(r),n.find("."+f).removeClass(f+"d")},300))}),n.on("mouseleave",function(){clearTimeout(e),a=setTimeout(function(){l.css(n.hasClass(c)?{height:0,top:l.position().top+l.height()/2,opacity:0}:{width:0,left:l.position().left+l.width()/2,opacity:0})},o)})),p.each(function(){var e=t(this),n=e.find("."+d);if(n[0]&&!e.find("."+f)[0]){var i=e.children("a");i.append('')}e.off("click",h.clickThis).on("click",h.clickThis),e.children("a").off("click",h.showChild).on("click",h.showChild),n.children("dd").off("click",h.clickChild).on("click",h.clickChild)})})},breadcrumb:function(){var e=".layui-breadcrumb";t(e).each(function(){var e=t(this),n=e.attr("lay-separator")||">",i=e.find("a");i.find(".layui-box")[0]||(i.each(function(e){e!==i.length-1&&t(this).append(''+n+"")}),e.css("visibility","visible"))})},progress:function(){var e="layui-progress";t("."+e).each(function(){var n=t(this),i=n.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",a),n.attr("lay-showPercent")&&setTimeout(function(){var t=Math.round(i.width()/n.width()*100);t>100&&(t=100),i.html(''+t+"%")},350)})},collapse:function(){var e="layui-collapse";t("."+e).each(function(){var e=t(this).find(".layui-colla-item");e.each(function(){var e=t(this),n=e.find(".layui-colla-title"),i=e.find(".layui-colla-content"),a="none"===i.css("display");n.find(".layui-colla-icon").remove(),n.append(''+(a?"":"")+""),n.off("click",h.collapse).on("click",h.collapse)})})}};return layui.each(e,function(e,t){t()})};var y=new o,m=t(document);y.init();var v=".layui-tab-title li";m.on("click",v,h.tabClick),m.on("click",h.hideTabMore),t(window).on("resize",h.tabAuto),e(i,function(e){return y.set(e)})}),layui.define("layer",function(e){"use strict";var t=layui.jquery,n=layui.layer,i=(layui.device(),"layui-upload-enter"),a="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},l=function(e){this.options=e};l.prototype.init=function(){var e=this,n=e.options,r=t("body"),l=t(n.elem||".layui-upload-file"),s=t('');return t("#"+a)[0]||r.append(s),l.each(function(r,l){l=t(l);var s='
      ',u=l.attr("lay-type")||n.type;n.unwrap||(s='
      '+s+''+(l.attr("lay-title")||n.title||"上传"+(o[u]||"图片"))+"
      "),s=t(s),n.unwrap||s.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),l.parent("form").attr("target")===a&&(n.unwrap?l.unwrap():(l.parent().next().remove(),l.unwrap().unwrap())),l.wrap(s),l.off("change").on("change",function(){e.action(this,u)})})},l.prototype.action=function(e,i){var o=this,l=o.options,s=e.value,u=t(e),c=u.attr("lay-ext")||l.ext||"";if(s){switch(i){case"file":if(c&&!RegExp("\\w\\.("+c+")$","i").test(escape(s)))return n.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(c||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(s)))return n.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(c||"mp3|wav|mid")+")$","i").test(escape(s)))return n.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(c||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(s)))return n.msg("不支持该图片格式",r),e.value=""}l.before&&l.before(e),u.parent().submit();var d=t("#"+a),f=setInterval(function(){var t;try{t=d.contents().find("body").text()}catch(i){n.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),d.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},n.msg("请对上传接口返回JSON字符",r)}"function"==typeof l.success&&l.success(t,e)}},30);e.value=""}},e("upload",function(e){var t=new l(e=e||{});t.init()})}),layui.define("layer",function(e){"use strict";var t=layui.jquery,n=layui.layer,i=layui.hint(),a=layui.device(),r="form",o=".layui-form",l="layui-this",s="layui-hide",u="layui-disabled",c=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:[/^\d+$/,"只能填写数字"],date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};c.prototype.set=function(e){var n=this;return t.extend(!0,n.config,e),n},c.prototype.verify=function(e){var n=this;return t.extend(!0,n.config.verify,e),n},c.prototype.on=function(e,t){return layui.onevent(r,e,t)},c.prototype.render=function(e){var n=this,a={select:function(){var e,n="请选择",i="layui-form-select",a="layui-select-title",c="layui-select-none",d="",f=t(o).find("select"),p=function(n,r){t(n.target).parent().hasClass(a)&&!r||(t("."+i).removeClass(i+"ed"),e&&d&&e.val(d)),e=null},h=function(n,o,f){var h=t(this),y=n.find("."+a),m=y.find("input"),v=n.find("dl"),g=v.children("dd");if(!o){var b=function(){n.addClass(i+"ed"),g.removeClass(s)},x=function(){n.removeClass(i+"ed"),m.blur(),w(m.val(),function(e){e&&(d=v.find("."+l).html(),m&&m.val(d))})};y.on("click",function(e){n.hasClass(i+"ed")?x():(p(e,!0),b()),v.find("."+c).remove()}),y.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var t=e.keyCode;9===t&&b()}).on("keydown",function(e){var t=e.keyCode;9===t?x():13===t&&e.preventDefault()});var w=function(e,n,i){var a=0;layui.each(g,function(){var n=t(this),r=n.text(),o=-1===r.indexOf(e);(""===e||"blur"===i?e!==r:o)&&a++,"keyup"===i&&n[o?"addClass":"removeClass"](s)});var r=a===g.length;return n(r),r},k=function(e){var t=this.value,n=e.keyCode;return 9!==n&&13!==n&&37!==n&&38!==n&&39!==n&&40!==n&&(w(t,function(e){e?v.find("."+c)[0]||v.append('

      无匹配项

      '):v.find("."+c).remove()},"keyup"),void(""===t&&v.find("."+c).remove()))};f&&m.on("keyup",k).on("blur",function(){e=m,d=v.find("."+l).html(),setTimeout(function(){w(m.val(),function(e){e&&!d&&m.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),i=e.attr("lay-value"),a=h.attr("lay-filter");return!e.hasClass(u)&&(h.val(i).removeClass("layui-form-danger"),m.val(e.text()),e.addClass(l).siblings().removeClass(l),layui.event.call(this,r,"select("+a+")",{elem:h[0],value:i,othis:n}),x(),!1)}),n.find("dl>dt").on("click",function(){return!1}),t(document).off("click",p).on("click",p)}};f.each(function(e,r){var o=t(this),s=o.next("."+i),c=this.disabled,d=r.value,f=t(r.options[r.selectedIndex]);if("string"==typeof o.attr("lay-ignore"))return o.show();var p="string"==typeof o.attr("lay-search"),y=t(['
      ','
      ','
      ','
      '+function(e){var t=[];return layui.each(e,function(e,n){(0!==e||n.value)&&t.push("optgroup"===n.tagName.toLowerCase()?"
      "+n.label+"
      ":'
      '+n.innerHTML+"
      ")}),t.join("")}(o.find("*"))+"
      ","
      "].join(""));s[0]&&s.remove(),o.after(y),h.call(this,y,c,p)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},n=t(o).find("input[type=checkbox]"),i=function(e,n){var i=t(this);e.on("click",function(){var t=i.attr("lay-filter"),a=(i.attr("lay-text")||"").split("|");i[0].disabled||(i[0].checked?(i[0].checked=!1,e.removeClass(n[1]).find("em").text(a[1])):(i[0].checked=!0,e.addClass(n[1]).find("em").text(a[0])),layui.event.call(i[0],r,n[2]+"("+t+")",{elem:i[0],value:i[0].value,othis:e}))})};n.each(function(n,a){var r=t(this),o=r.attr("lay-skin"),l=(r.attr("lay-text")||"").split("|"),s=this.disabled;"switch"===o&&(o="_"+o);var c=e[o]||e.checkbox;if("string"==typeof r.attr("lay-ignore"))return r.show();var d=r.next("."+c[0]),f=t(['
      ',{_switch:""+((a.checked?l[0]:l[1])||"")+""}[o]||(a.title.replace(/\s/g,"")?""+a.title+"":"")+''+(o?"":"")+"","
      "].join(""));d[0]&&d.remove(),r.after(f),i.call(this,f,c)})},radio:function(){var e="layui-form-radio",n=["",""],i=t(o).find("input[type=radio]"),a=function(i){var a=t(this),l="layui-anim-scaleSpring";i.on("click",function(){var s=a[0].name,u=a.parents(o),c=a.attr("lay-filter"),d=u.find("input[name="+s.replace(/(\.|#|\[|\])/g,"\\$1")+"]");a[0].disabled||(layui.each(d,function(){var i=t(this).next("."+e);this.checked=!1,i.removeClass(e+"ed"),i.find(".layui-icon").removeClass(l).html(n[1])}),a[0].checked=!0,i.addClass(e+"ed"),i.find(".layui-icon").addClass(l).html(n[0]),layui.event.call(a[0],r,"radio("+c+")",{elem:a[0],value:a[0].value,othis:i}))})};i.each(function(i,r){var o=t(this),l=o.next("."+e),s=this.disabled;if("string"==typeof o.attr("lay-ignore"))return o.show();var c=t(['
      ',''+n[r.checked?0:1]+"",""+(r.title||"未命名")+"","
      "].join(""));l[0]&&l.remove(),o.after(c),a.call(this,c)})}};return e?a[e]?a[e]():i.error("不支持的"+e+"表单渲染"):layui.each(a,function(e,t){t()}),n};var d=function(){var e=t(this),i=f.config.verify,l=null,s="layui-form-danger",u={},c=e.parents(o),d=c.find("*[lay-verify]"),p=e.parents("form")[0],h=c.find("input,select,textarea"),y=e.attr("lay-filter");return layui.each(d,function(e,r){var o=t(this),u=o.attr("lay-verify").split("|"),c="",d=o.val();return o.removeClass(s),layui.each(u,function(e,t){var u="function"==typeof i[t];return i[t]&&(u?c=i[t](d,r):!i[t][0].test(d))?(n.msg(c||i[t][1],{icon:5,shift:6}),a.android||a.ios||r.focus(),o.addClass(s),l=!0):void 0}),l?l:void 0}),!l&&(layui.each(h,function(e,t){t.name&&(/^checkbox|radio$/.test(t.type)&&!t.checked||(u[t.name]=t.value))}),layui.event.call(this,r,"submit("+y+")",{elem:this,form:p,field:u}))},f=new c,p=t(document);f.render(),p.on("reset",o,function(){setTimeout(function(){f.render()},50)}),p.on("submit",o,d).on("click","*[lay-submit]",d),e(r,function(e){return f.set(e)})}),layui.define("jquery",function(e){"use strict";var t=layui.jquery,n=layui.hint(),i="layui-tree-enter",a=function(e){this.options=e},r={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};a.prototype.init=function(e){var t=this;e.addClass("layui-box layui-tree"),t.options.skin&&e.addClass("layui-tree-skin-"+t.options.skin),t.tree(e),t.on(e)},a.prototype.tree=function(e,n){var i=this,a=i.options,o=n||a.nodes;layui.each(o,function(n,o){var l=o.children&&o.children.length>0,s=t('
        '),u=t(["
      • ",function(){return l?''+(o.spread?r.arrow[1]:r.arrow[0])+"":""}(),function(){return a.check?''+("checkbox"===a.check?r.checkbox[0]:"radio"===a.check?r.radio[0]:"")+"":""}(),function(){return'"+(''+(l?o.spread?r.branch[1]:r.branch[0]:r.leaf)+"")+(""+(o.name||"未命名")+"")}(),"
      • "].join(""));l&&(u.append(s),i.tree(s,o.children)),e.append(u),"function"==typeof a.click&&i.click(u,o),i.spread(u,o),a.drag&&i.drag(u,o)})},a.prototype.click=function(e,t){var n=this,i=n.options;e.children("a").on("click",function(e){layui.stope(e),i.click(t)})},a.prototype.spread=function(e){var t=this,n=(t.options,e.children(".layui-tree-spread")),i=e.children("ul"),a=e.children("a"),o=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),n.html(r.arrow[0]),a.find(".layui-icon").html(r.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),n.html(r.arrow[1]),a.find(".layui-icon").html(r.branch[1]))};i[0]&&(n.on("click",o),a.on("dblclick",o)) -},a.prototype.on=function(e){var n=this,a=n.options,r="layui-tree-drag";e.find("i").on("selectstart",function(){return!1}),a.drag&&t(document).on("mousemove",function(e){var i=n.move;if(i.from){var a=(i.to,t('
        '));e.preventDefault(),t("."+r)[0]||t("body").append(a);var o=t("."+r)[0]?t("."+r):a;o.addClass("layui-show").html(i.from.elem.children("a").html()),o.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=n.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),n.move={},t("."+r).remove())})},a.prototype.move={},a.prototype.drag=function(e,n){var a=this,r=(a.options,e.children("a")),o=function(){var r=t(this),o=a.move;o.from&&(o.to={item:n,elem:e},r.addClass(i))};r.on("mousedown",function(){var t=a.move;t.from={item:n,elem:e}}),r.on("mouseenter",o).on("mousemove",o).on("mouseleave",function(){var e=t(this),n=a.move;n.from&&(delete n.to,e.removeClass(i))})},e("tree",function(e){var i=new a(e=e||{}),r=t(e.elem);return r[0]?void i.init(r):n.error("layui.tree 没有找到"+e.elem+"元素")})}),layui.define("jquery",function(e){"use strict";var t=layui.jquery,n={fixbar:function(e){e=e||{},e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var n,i,a="layui-fixbar-top",r=[e.bar1===!0?"":e.bar1,e.bar2===!0?"":e.bar2,""],o=t(['
          ',e.bar1?'
        • '+r[0]+"
        • ":"",e.bar2?'
        • '+r[1]+"
        • ":"",'
        • '+r[2]+"
        • ","
        "].join("")),l=o.find("."+a),s=function(){var n=t(document).scrollTop();n>=(e.showHeight||200)?i||(l.show(),i=1):i&&(l.hide(),i=0)};t(".layui-fixbar")[0]||("object"==typeof e.css&&o.css(e.css),t("body").append(o),s(),o.find("li").on("click",function(){var n=t(this),i=n.attr("lay-type");"top"===i&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,i)}),t(document).on("scroll",function(){n&&clearTimeout(n),n=setTimeout(function(){s()},100)}))}};e("util",n)}),layui.define("jquery",function(e){"use strict";var t=layui.jquery,n=function(){},i='';n.prototype.load=function(e){var n,a,r,o,l=this,s=0;e=e||{};var u=t(e.elem);if(u[0]){var c=t(e.scrollElem||document),d=e.mb||50,f=!("isAuto"in e)||e.isAuto,p=e.end||"没有更多了",h=e.scrollElem&&e.scrollElem!==document,y="加载更多",m=t('");u.find(".layui-flow-more")[0]||u.append(m);var v=function(e,i){e=t(e),m.before(e),i=0==i||null,i?m.html(p):m.find("a").html(y),a=i,n=null,r&&r()},g=function(){n=!0,m.find("a").html(i),"function"==typeof e.done&&e.done(++s,v)};if(g(),m.find("a").on("click",function(){t(this),a||n||g()}),e.isLazyimg)var r=l.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return f?(c.on("scroll",function(){var e=t(this),i=e.scrollTop();o&&clearTimeout(o),a||(o=setTimeout(function(){var a=h?e.height():t(window).height(),r=h?e.prop("scrollHeight"):document.documentElement.scrollHeight;d>=r-i-a&&(n||g())},100))}),l):l}},n.prototype.lazyimg=function(e){var n,i=this,a=0;e=e||{};var r=t(e.scrollElem||document),o=e.elem||"img",l=e.scrollElem&&e.scrollElem!==document,s=function(e,t){var n=r.scrollTop(),o=n+t,s=l?function(){return e.offset().top-r.offset().top+n}():e.offset().top;if(s>=n&&o>=s&&!e.attr("src")){var c=e.attr("lay-src");layui.img(c,function(){var t=i.lazyimg.elem.eq(a);e.attr("src",c).removeAttr("lay-src"),t[0]&&u(t),a++})}},u=function(e,n){var u=l?(n||r).height():t(window).height(),c=r.scrollTop(),d=c+u;if(i.lazyimg.elem=t(o),e)s(e,u);else for(var f=0;fd)break}};if(u(),!n){var c;r.on("scroll",function(){var e=t(this);c&&clearTimeout(c),c=setTimeout(function(){u(null,e)},50)}),n=!0}return u},e("flow",new n)}),layui.define(["layer","form"],function(e){"use strict";var t=layui.jquery,n=layui.layer,i=layui.form(),a=(layui.hint(),layui.device()),r="layedit",o="layui-show",l="layui-disabled",s=function(){var e=this;e.index=0,e.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(e){var n=this;return t.extend(!0,n.config,e),n},s.prototype.on=function(e,t){return layui.onevent(r,e,t)},s.prototype.build=function(e,n){n=n||{};var i=this,r=i.config,l="layui-layedit",s=t("#"+e),c="LAY_layedit_"+ ++i.index,d=s.next("."+l),f=t.extend({},r,n),p=function(){var e=[],t={};return layui.each(f.hideTool,function(e,n){t[n]=!0}),layui.each(f.tool,function(n,i){k[i]&&!t[i]&&e.push(k[i])}),e.join("")}(),h=t(['
        ','
        '+p+"
        ",'
        ','',"
        ","
        "].join(""));return a.ie&&a.ie<8?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),u.call(i,h,s[0],f),s.addClass("layui-hide").after(h),i.index)},s.prototype.getContent=function(e){var t=c(e);return t[0]?d(t[0].document.body.innerHTML):void 0},s.prototype.getText=function(e){var n=c(e);return n[0]?t(n[0].document.body).text():void 0},s.prototype.sync=function(e){var n=c(e);if(n[0]){var i=t("#"+n[1].attr("textarea"));i.val(d(n[0].document.body.innerHTML))}},s.prototype.getSelection=function(e){var t=c(e);if(t[0]){var n=h(t[0].document);return document.selection?n.text:n.toString()}};var u=function(e,n,i){var a=this,r=e.find("iframe");r.css({height:i.height}).on("load",function(){var o=r.contents(),l=r.prop("contentWindow"),s=o.find("head"),u=t([""].join("")),c=o.find("body");s.append(u),c.attr("contenteditable","true").css({"min-height":i.height}).html(n.value||""),f.apply(a,[l,r,n,i]),g.call(a,l,e,i)})},c=function(e){var n=t("#LAY_layedit_"+e),i=n.prop("contentWindow");return[i,n]},d=function(e){return 8==a.ie&&(e=e.replace(/<.+>/g,function(e){return e.toLowerCase()})),e},f=function(e,i,r){var o=e.document,l=t(o.body);l.on("keydown",function(e){var t=e.keyCode;if(13===t){var i=h(o),a=y(i),r=a.parentNode;if("pre"===r.tagName.toLowerCase()){if(e.shiftKey)return;return n.msg("请暂时用shift+enter"),!1}o.execCommand("formatBlock",!1,"

        ")}}),t(r).parents("form").on("submit",function(){var e=l.html();8==a.ie&&(e=e.replace(/<.+>/g,function(e){return e.toLowerCase()})),r.value=e}),l.on("paste",function(){o.execCommand("formatBlock",!1,"

        "),setTimeout(function(){p.call(e,l),r.value=l.html()},100)})},p=function(e){var n=this;n.document,e.find("*[style]").each(function(){var e=this.style.textAlign;this.removeAttribute("style"),t(this).css({"text-align":e||""})}),e.find("table").addClass("layui-table"),e.find("script,link").remove()},h=function(e){return e.selection?e.selection.createRange():e.getSelection().getRangeAt(0)},y=function(e){return e.endContainer||e.parentElement().childNodes[0]},m=function(e,n,i){var a=this.document,r=document.createElement(e);for(var o in n)r.setAttribute(o,n[o]);if(r.removeAttribute("text"),a.selection){var l=i.text||n.text;if("a"===e&&!l)return;l&&(r.innerHTML=l),i.pasteHTML(t(r).prop("outerHTML")),i.select()}else{var l=i.toString()||n.text;if("a"===e&&!l)return;l&&(r.innerHTML=l),i.deleteContents(),i.insertNode(r)}},v=function(e,n){var i=this.document,a="layedit-tool-active",r=y(h(i)),o=function(t){return e.find(".layedit-tool-"+t)};n&&n[n.hasClass(a)?"removeClass":"addClass"](a),e.find(">i").removeClass(a),o("unlink").addClass(l),t(r).parents().each(function(){var e=this.tagName.toLowerCase(),t=this.style.textAlign;"b"!==e&&"strong"!==e||o("b").addClass(a),"i"!==e&&"em"!==e||o("i").addClass(a),"u"===e&&o("u").addClass(a),"strike"===e&&o("d").addClass(a),"p"===e&&("center"===t?o("center").addClass(a):"right"===t?o("right").addClass(a):o("left").addClass(a)),"a"===e&&(o("link").addClass(a),o("unlink").removeClass(l))})},g=function(e,i,a){var r=e.document,o=t(r.body),s={link:function(n){var i=y(n),a=t(i).parent();b.call(o,{href:a.attr("href"),target:a.attr("target")},function(t){var i=a[0];"A"===i.tagName?i.href=t.url:m.call(e,"a",{target:t.target,href:t.url,text:t.url},n)})},unlink:function(){r.execCommand("unlink")},face:function(t){x.call(this,function(n){m.call(e,"img",{src:n.src,alt:n.alt},t)})},image:function(i){var r=this;layui.use("upload",function(o){var l=a.uploadImage||{};o({url:l.url,method:l.type,elem:t(r).find("input")[0],unwrap:!0,success:function(t){0==t.code?(t.data=t.data||{},m.call(e,"img",{src:t.data.src,alt:t.data.title},i)):n.msg(t.msg||"上传失败")}})})},code:function(t){w.call(o,function(n){m.call(e,"pre",{text:n.code,"lay-lang":n.lang},t)})},help:function(){n.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},u=i.find(".layui-layedit-tool"),c=function(){var n=t(this),i=n.attr("layedit-event"),a=n.attr("lay-command");if(!n.hasClass(l)){o.focus();var c=h(r);c.commonAncestorContainer,a?(r.execCommand(a),/justifyLeft|justifyCenter|justifyRight/.test(a)&&r.execCommand("formatBlock",!1,"

        "),setTimeout(function(){o.focus()},10)):s[i]&&s[i].call(this,c),v.call(e,u,n)}},d=/image/;u.find(">i").on("mousedown",function(){var e=t(this),n=e.attr("layedit-event");d.test(n)||c.call(this)}).on("click",function(){var e=t(this),n=e.attr("layedit-event");d.test(n)&&c.call(this)}),o.on("click",function(){v.call(e,u),n.close(x.index)})},b=function(e,t){var a=this,r=n.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

          ','
        • ','','
          ','',"
          ","
        • ",'
        • ','','
          ','",'","
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(e,r){var o="submit(layedit-link-yes)";i.render("radio"),e.find(".layui-btn-primary").on("click",function(){n.close(r),a.focus()}),i.on(o,function(e){n.close(b.index),t&&t(e.field)})}});b.index=r},x=function(e){var i=function(){var e=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],t={};return layui.each(e,function(e,n){t[n]=layui.cache.dir+"images/face/"+e+".gif"}),t}();return x.hide=x.hide||function(e){"face"!==t(e.target).attr("layedit-event")&&n.close(x.index)},x.index=n.tips(function(){var e=[];return layui.each(i,function(t,n){e.push('
      • '+t+'
      • ')}),'
          '+e.join("")+"
        "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(a,r){a.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){e&&e({src:i[this.title],alt:this.title}),n.close(r)}),t(document).off("click",x.hide).on("click",x.hide)}})},w=function(e){var t=this,a=n.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
          ','
        • ','','
          ','","
          ","
        • ",'
        • ','','
          ','',"
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(a,r){var o="submit(layedit-code-yes)";i.render("select"),a.find(".layui-btn-primary").on("click",function(){n.close(r),t.focus()}),i.on(o,function(t){n.close(w.index),e&&e(t.field)})}});w.index=a},k={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},C=new s;e(r,C)}),layui.define("jquery",function(e){"use strict";var t=layui.jquery,n="http://www.layui.com/doc/modules/code.html";e("code",function(e){var i=[];e=e||{},e.elem=t(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){i.push(this)}),layui.each(i.reverse(),function(i,a){var r=t(a),o=r.html();(r.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),r.html('
        1. '+o.replace(/[\r\t\n]+/g,"
        2. ")+"
        "),r.find(">.layui-code-h3")[0]||r.prepend('

        '+(r.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

        ");var l=r.find(">.layui-code-ol");r.addClass("layui-box layui-code-view"),(r.attr("lay-skin")||e.skin)&&r.addClass("layui-code-"+(r.attr("lay-skin")||e.skin)),(l.find("li").length/100|0)>0&&l.css("margin-left",(l.find("li").length/100|0)+"px"),(r.attr("lay-height")||e.height)&&l.css("max-height",r.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/carousel.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/carousel.js deleted file mode 100644 index 84f3028..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/carousel.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
          ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
        "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
        1. '+o.replace(/[\r\t\n]+/g,"
        2. ")+"
        "),c.find(">.layui-code-h3")[0]||c.prepend('

        '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

        ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/element.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/element.js deleted file mode 100644 index 4011582..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/element.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(i){"use strict";var t=layui.$,a=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var a=this;return t.extend(!0,a.config,i),a},s.prototype.on=function(i,t){return layui.onevent.call(this,e,i,t)},s.prototype.tabAdd=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),c='
      • '+(a.title||"unnaming")+"
      • ";return s[0]?s.before(c):n.append(c),o.append('
        '+(a.content||"")+"
        "),y.hideTabMore(!0),y.tabAuto(),this},s.prototype.tabDelete=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return y.tabDelete(null,s),this},s.prototype.tabChange=function(i,a){var e=".layui-tab-title",l=t(".layui-tab[lay-filter="+i+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return y.tabClick(null,null,s),this},s.prototype.tab=function(i){i=i||{},v.on("click",i.headerElem,function(a){var e=t(this).index();y.tabClick.call(this,a,e,null,i)})},s.prototype.progress=function(i,a){var e="layui-progress",l=t("."+e+"[lay-filter="+i+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",a),s.text(a),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",f="layui-anim layui-anim-upbit",y={tabClick:function(i,a,s,o){o=o||{};var c=s||t(this),a=a||c.parent().children("li").index(c),r=o.headerElem?c.parent():c.parents(".layui-tab").eq(0),u=o.bodyElem?t(o.bodyElem):r.children(".layui-tab-content").children(".layui-tab-item"),d=c.find("a"),h=r.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(c.addClass(l).siblings().removeClass(l),u.eq(a).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+h+")",{elem:r,index:a})},tabDelete:function(i,a){var n=a||t(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),c=o.children(".layui-tab-content").children(".layui-tab-item"),r=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?y.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&y.tabClick.call(n.prev()[0],null,s-1)),n.remove(),c.eq(s).remove(),setTimeout(function(){y.tabAuto()},50),layui.event.call(this,e,"tabDelete("+r+")",{elem:o,index:s})},tabAuto:function(){var i="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;t(".layui-tab").each(function(){var s=t(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=t('');if(n===window&&8!=a.ie&&y.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=t(this);if(!i.find("."+l)[0]){var a=t('');a.on("click",y.tabDelete),i.append(a)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(t){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var a=t(".layui-tab-title");i!==!0&&"tabmore"===t(i.target).attr("lay-stope")||(a.removeClass("layui-tab-more"),a.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=t(this),a=i.parents(o),n=a.attr("lay-filter"),s=i.find("a"),c="string"==typeof i.attr("lay-unselect");i.find("."+d)[0]||("javascript:;"!==s.attr("href")&&"_blank"===s.attr("target")||c||(a.find("."+l).removeClass(l),i.addClass(l)),layui.event.call(this,e,"nav("+n+")",i))},clickChild:function(){var i=t(this),a=i.parents(o),n=a.attr("lay-filter");a.find("."+l).removeClass(l),i.addClass(l),layui.event.call(this,e,"nav("+n+")",i)},showChild:function(){var i=t(this),a=i.parents(o),e=i.parent(),l=i.siblings("."+d);a.hasClass(u)&&(l.removeClass(f),e["none"===l.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=t(this),a=i.find(".layui-colla-icon"),l=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}l[c?"addClass":"removeClass"](n),a.html(c?"":""),layui.event.call(this,e,"collapse("+o+")",{title:i,content:l,show:c})}};s.prototype.init=function(i,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){y.tabAuto.call({})},nav:function(){var i=200,e={},s={},p={},v=function(l,o,c){var r=t(this),y=r.find("."+d);o.hasClass(u)?l.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(y.addClass(f),l.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-l.height()}),e[c]=setTimeout(function(){l.css({width:r.width(),opacity:1})},a.ie&&a.ie<10?0:i),clearTimeout(p[c]),"block"===y.css("display")&&clearTimeout(s[c]),s[c]=setTimeout(function(){y.addClass(n),r.find("."+h).addClass(h+"d")},300))};t(o+l).each(function(a){var l=t(this),o=t(''),f=l.find("."+c);l.find("."+r)[0]||(l.append(o),f.on("mouseenter",function(){v.call(this,o,l,a)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[a]),s[a]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+h).removeClass(h+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[a]),p[a]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},i)})),f.each(function(){var i=t(this),a=i.find("."+d);if(a[0]&&!i.find("."+h)[0]){var e=i.children("a");e.append('')}i.off("click",y.clickThis).on("click",y.clickThis),i.children("a").off("click",y.showChild).on("click",y.showChild),a.children("dd").off("click",y.clickChild).on("click",y.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";t(i+l).each(function(){var i=t(this),a="lay-separator",e=i.attr(a)||"/",l=i.find("a");l.next("span["+a+"]")[0]||(l.each(function(i){i!==l.length-1&&t(this).after(""+e+"")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";t("."+i+l).each(function(){var a=t(this),e=a.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),a.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var i="layui-collapse";t("."+i+l).each(function(){var i=t(this).find(".layui-colla-item");i.each(function(){var i=t(this),a=i.find(".layui-colla-title"),e=i.find(".layui-colla-content"),l="none"===e.css("display");a.find(".layui-colla-icon").remove(),a.append(''+(l?"":"")+""),a.off("click",y.collapse).on("click",y.collapse)})})}};return s[i]?s[i]():layui.each(s,function(i,t){t()})},s.prototype.render=s.prototype.init;var p=new s,v=t(document);p.render();var b=".layui-tab-title li";v.on("click",b,y.tabClick),v.on("click",y.hideTabMore),t(window).on("resize",y.tabAuto),i(e,p)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/flow.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/flow.js deleted file mode 100644 index f3d2852..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/flow.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/form.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/form.js deleted file mode 100644 index c401f1c..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/form.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",s=".layui-form",r="layui-this",u="layui-hide",o="layui-disabled",c=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};c.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},c.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},c.prototype.on=function(e,i){return layui.onevent.call(this,l,e,i)},c.prototype.render=function(e,t){var n=this,c=i(s+function(){return t?'[lay-filter="'+t+'"]':""}()),d={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",s="layui-select-none",d="",f=c.find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},h=function(t,c,f){var h=i(this),p=t.find("."+n),m=p.find("input"),k=t.find("dl"),g=k.children("dd");if(!c){var b=function(){var e=t.offset().top+t.outerHeight()+5-v.scrollTop(),i=k.outerHeight();t.addClass(a+"ed"),g.removeClass(u),e+i>v.height()&&e>=i&&t.addClass(a+"up")},x=function(e){t.removeClass(a+"ed "+a+"up"),m.blur(),e||C(m.val(),function(e){e&&(d=k.find("."+r).html(),m&&m.val(d))})};p.on("click",function(e){t.hasClass(a+"ed")?x():(y(e,!0),b()),k.find("."+s).remove()}),p.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var i=e.keyCode;9===i&&b()}).on("keydown",function(e){var i=e.keyCode;9===i?x():13===i&&e.preventDefault()});var C=function(e,t,a){var n=0;layui.each(g,function(){var t=i(this),l=t.text(),s=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:s)&&n++,"keyup"===a&&t[s?"addClass":"removeClass"](u)});var l=n===g.length;return t(l),l},w=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(C(i,function(e){e?k.find("."+s)[0]||k.append('

        无匹配项

        '):k.find("."+s).remove()},"keyup"),void(""===i&&k.find("."+s).remove()))};f&&m.on("keyup",w).on("blur",function(i){e=m,d=k.find("."+r).html(),setTimeout(function(){C(m.val(),function(e){d||m.val("")},"blur")},200)}),g.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=h.attr("lay-filter");return!e.hasClass(o)&&(e.hasClass("layui-select-tips")?m.val(""):(m.val(e.text()),e.addClass(r)),e.siblings().removeClass(r),h.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:h[0],value:a,othis:t}),x(!0),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var s=i(this),u=s.next("."+a),c=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]),y=l.options[0];if("string"==typeof s.attr("lay-ignore"))return s.show();var v="string"==typeof s.attr("lay-search"),p=y?y.value?t:y.innerHTML||t:t,m=i(['
        ','
        ','
        ','
        '+function(e){var i=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?i.push("
        "+a.label+"
        "):i.push('
        '+a.innerHTML+"
        "):i.push('
        '+(a.innerHTML||t)+"
        ")}),0===i.length&&i.push('
        没有选项
        '),i.join("")}(s.find("*"))+"
        ","
        "].join(""));u[0]&&u.remove(),s.after(m),h.call(this,m,c,v)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=c.find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),s=l.attr("lay-skin"),r=(l.attr("lay-text")||"").split("|"),u=this.disabled;"switch"===s&&(s="_"+s);var c=e[s]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+c[0]),f=i(['
        ',{_switch:""+((n.checked?r[0]:r[1])||"")+""}[s]||(n.title.replace(/\s/g,"")?""+n.title+"":"")+''+(s?"":"")+"","
        "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,c)})},radio:function(){var e="layui-form-radio",t=["",""],a=c.find("input[type=radio]"),n=function(a){var n=i(this),r="layui-anim-scaleSpring";a.on("click",function(){var u=n[0].name,o=n.parents(s),c=n.attr("lay-filter"),d=o.find("input[name="+u.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(r).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(r).html(t[0]),layui.event.call(n[0],l,"radio("+c+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var s=i(this),r=s.next("."+e),u=this.disabled;if("string"==typeof s.attr("lay-ignore"))return s.show();var c=i(['
        ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
        "].join(""));r[0]&&r.remove(),s.after(c),n.call(this,c)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,i){i()}),n};var d=function(){var e=i(this),a=f.config.verify,r=null,u="layui-form-danger",o={},c=e.parents(s),d=c.find("*[lay-verify]"),y=e.parents("form")[0],v=c.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var s=i(this),o=s.attr("lay-verify").split("|"),c=s.attr("lay-verType"),d=s.val();if(s.removeClass(u),layui.each(o,function(e,i){var o,f="",y="function"==typeof a[i];if(a[i]){var o=y?f=a[i](d,l):!a[i][0].test(d);if(f=f||a[i][1],o)return"tips"===c?t.tips(f,s,{tips:1}):"alert"===c?t.alert(f,{title:"提示",shadeClose:!0}):t.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),s.addClass(u),r=!0}}),r)return r}),!r&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(o[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:o}))},f=new c,y=i(document),v=i(window);f.render(),y.on("reset",s,function(){var e=i(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),y.on("submit",s,d).on("click","*[lay-submit]",d),e(l,f)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laydate.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laydate.js deleted file mode 100644 index 7da0d41..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laydate.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
        建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3)},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
        "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
        已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

        "+r.time[e]+"

          "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
        ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s','
        '+f+"
        ",'
        ','',"
        ",""].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

        ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

        "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

        "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

          ','
        • ','','
          ','',"
          ","
        • ",'
        • ','','
          ','",'","
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
      • '+e+'
      • ')}),'
          '+t.join("")+"
        "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
          ','
        • ','','
          ','","
          ","
        • ",'
        • ','','
          ','',"
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laypage.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laypage.js deleted file mode 100644 index 5dc3751..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laypage.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),skip:function(){return['到第','','页',""].join("")}()};return['
        ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
        "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/mobile.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/mobile.js deleted file mode 100644 index 4ef0e54..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/mobile.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

        '+(e?i.title[0]:i.title)+"

        ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
        '+e+"
        "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

        '+(i.content||"")+"

        "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
        ':"")+'
        "+l+'
        '+i.content+"
        "+d+"
        ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
        ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
        ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
        '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
        "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/table.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/table.js deleted file mode 100644 index ca17f02..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/table.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define(["laytpl","laypage","layer","form"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.hint(),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,s,e,t)}},c=function(){var e=this,t=e.config,i=t.id;return i&&(c.config[i]=t),{reload:function(t){e.reload.call(e,t)},config:t}},s="table",u=".layui-table",h="layui-hide",f="layui-none",y="layui-table-view",p=".layui-table-header",m=".layui-table-body",v=".layui-table-main",g=".layui-table-fixed",x=".layui-table-fixed-l",b=".layui-table-fixed-r",k=".layui-table-tool",C=".layui-table-page",w=".layui-table-sort",N="layui-table-edit",F="layui-table-hover",W=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['
        ',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
        ','
        1){ }}","group","{{# } else { }}","{{d.index}}-{{item2.field || i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(!(item2.colspan > 1) && item2.sort){ }}",'',"{{# } }}","{{# } }}","
        ","
        "].join("")},z=['',"","
        "].join(""),T=['
        ',"{{# if(d.data.toolbar){ }}",'
        ',"{{# } }}",'
        ',"{{# var left, right; }}",'
        ',W(),"
        ",'
        ',z,"
        ","{{# if(left){ }}",'
        ','
        ',W({fixed:!0}),"
        ",'
        ',z,"
        ","
        ","{{# }; }}","{{# if(right){ }}",'
        ','
        ',W({fixed:"right"}),'
        ',"
        ",'
        ',z,"
        ","
        ","{{# }; }}","
        ","{{# if(d.data.page){ }}",'
        ','
        ',"
        ","{{# } }}","","
        "].join(""),M=t(window),S=t(document),A=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};A.prototype.config={limit:10,loading:!0,cellMinWidth:60},A.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id"),a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;e.setArea();var l=a.elem,n=l.next("."+y),o=e.elem=t(i(T).render({VIEW_CLASS:y,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layHeader=o.find(p),e.layMain=o.find(v),e.layBody=o.find(m),e.layFixed=o.find(g),e.layFixLeft=o.find(x),e.layFixRight=o.find(b),e.layTool=o.find(k),e.layPage=o.find(C),e.layTool.html(i(t(a.toolbar).html()||"").render(a)),a.height&&e.fullSize(),a.cols.length>1){var r=e.layFixed.find(p).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},A.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},A.prototype.setArea=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=t.width||function(){var e=function(i){var a,l;return i=i||t.elem.parent(),a=i.width(),l="none"===i.css("display"),!i[0]||a&&!l?a:e(i.parent())};return e()}();e.eachCols(function(){i++}),o-=function(){return"line"===t.skin||"nob"===t.skin?2:i+1}(),layui.each(t.cols,function(t,i){layui.each(i,function(t,l){var r;return l?(e.initOpts(l),r=l.width||0,void(l.colspan>1||(/\d+%$/.test(r)?l.width=r=Math.floor(parseFloat(r)/100*o):r||(l.width=r=0,a++),n+=r))):void i.splice(t,1)})}),e.autoColNums=a,o>n&&a&&(l=(o-n)/a),layui.each(t.cols,function(e,i){layui.each(i,function(e,i){var a=i.minWidth||t.cellMinWidth;i.colspan>1||0===i.width&&(i.width=Math.floor(l>=a?l:a))})}),t.height&&/^full-\d+$/.test(t.height)&&(e.fullHeightGap=t.height.split("-")[1],t.height=M.height()-e.fullHeightGap)},A.prototype.reload=function(e){var i=this;i.config=t.extend({},i.config,e),i.render()},A.prototype.page=1,A.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(a.startTime=(new Date).getTime(),n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit,t.ajax({type:n.method||"get",url:n.url,data:t.extend(c,n.where),dataType:"json",success:function(t){return t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
        '+(t[r.msgName]||"返回的数据状态异常")+"
        ")):(a.renderData(t,e,t[r.countName]),d(),n.time=(new Date).getTime()-a.startTime+" ms",i&&l.close(i),void("function"==typeof n.done&&n.done(t,e,t[r.countName])))},error:function(e,t){a.layMain.html('
        数据接口请求异常
        '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var s={},u=e*n.limit-n.limit;s[r.dataName]=n.data.concat().splice(u,n.limit),s[r.countName]=n.data.length,a.renderData(s,e,n.data.length),d(),"function"==typeof n.done&&n.done(s,e,s[r.countName])}},A.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},A.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],y=[],p=[],m=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],o=[],u=[],f=e+s.limit*(n-1)+1;0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,n){var r=n.field||e,h=a[r];c.getColElem(c.layHeader,r);if(void 0!==h&&null!==h||(h=""),!(n.colspan>1)){var y=['",'
        '+function(){var e=t.extend(!0,{LAY_INDEX:f},a);return"checkbox"===n.type?'":"numbers"===n.type?f:n.toolbar?i(t(n.toolbar).html()||"").render(e):n.templet?i(t(n.templet).html()||String(h)).render(e):h}(),"
        "].join("");l.push(y),n.fixed&&"right"!==n.fixed&&o.push(y),"right"===n.fixed&&u.push(y)}}),h.push(''+l.join("")+""),y.push(''+o.join("")+""),p.push(''+u.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(y.join("")),c.layFixRight.find("tbody").html(p.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
        无数据
        ')):(m(),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}},s.page),s.page.count=o,a.render(s.page))))},A.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},A.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},A.prototype.sort=function(e,i,a,l){var n,r,c=this,u={},h=c.config,f=h.elem.attr("lay-filter"),y=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var p=c.layHeader.find("th .laytable-cell-"+h.index+"-"+n).find(w);c.layHeader.find("th").find(w).removeAttr("lay-sort"),p.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},"asc"===i?r=layui.sort(y,n):"desc"===i?r=layui.sort(y,n,!0):(r=layui.sort(y,d.config.indexName),delete c.sortKey),u[h.response.dataName]=r,c.renderData(u,c.page,c.count,!0),l&&layui.event.call(e,s,"sort("+f+")",{field:n,type:i})},A.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-M.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-M.scrollLeft()+"px"],anim:-1,fixed:!1})},A.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},A.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},A.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},A.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=M.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.toolbar&&(e-=t.layTool.outerHeight()),i.page&&(e=e-t.layPage.outerHeight()-1),t.layMain.css("height",e)},A.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},A.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=e.getScrollWidth(e.layMain[0]),o=i.outerWidth()-e.layMain.width();if(e.autoColNums&&o<5&&!e.scrollPatchWStatus){var r=e.layHeader.eq(0).find("thead th:last-child"),d=r.data("field");e.getCssRule(d,function(t){var i=t.style.width||r.outerWidth();t.style.width=parseFloat(i)-n-o+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px"),e.scrollPatchWStatus=!0})}if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var c=t('
        ');c.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(c)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var s=e.layMain.height(),u=s-l;e.layFixed.find(m).css("height",i.height()>u?u:"auto"),e.layFixRight[o>0?"removeClass":"addClass"](h),e.layFixRight.css("right",a-1)},A.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),h=".layui-table-cell",f=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(c.allowResize){var l=i.data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=i.data("minwidth")||n.cellMinWidth})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];i');d[0].value=e.data("content")||o.text(),e.find("."+N)[0]||e.append(d),d.focus()}else o.find(".layui-form-switch,.layui-form-checkbox")[0]||Math.round(o.prop("scrollWidth"))>Math.round(o.outerWidth())&&(a.tipsIndex=l.tips(['
        ',o.html(),"
        ",''].join(""),o[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+f+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(h).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),M.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},c.config={},d.reload=function(e,i){var a=c.config[e];return a?d.render(t.extend(!0,{},a,i)):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new A(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/upload.js b/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/upload.js deleted file mode 100644 index 63d9f83..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/upload.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v2.2.3 MIT License By http://www.layui.com */ - ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var i=this;i.config=t.extend({},i.config,o.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['"].join("")),o=i.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&i.elem.wrap('
        '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t(''),a=t(['
        ',"
        "].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(f)||(e.elemFile.wrap(a),i.elem.next("."+f).append(function(){var e=[];return layui.each(i.data,function(t,i){e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var i=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&i+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:i,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,t){r.append(e,t)}),t.ajax({url:l.url,type:l.method,data:r,contentType:!1,processData:!1,dataType:"json",success:function(t){i++,d(e,t),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=t("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||o.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){o.preview(e)},upload:function(e,t){var i={};i[e]=t,o.upload(i)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,t){o.files[e]=t}),o.files}},y=function(){return"choose"===i?l.choose&&l.choose(g):(l.before&&l.before(g),a.ie?a.ie>9?u():c():void u())};switch(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传 "+o.fileLength+" 个");if(layui.each(o.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?Math.floor(i)+(i%1>0?i.toFixed(1):0)+"MB":l.size+"KB",r.value="",F=i}}),F)return o.msg("文件不能超过"+F)}y()},p.prototype.events=function(){var e=this,i=e.config,o=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var a=e.elemFile,o=t.length>1?t.length+"个文件":(t[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||a.after(''+o+"")};i.elem.off("upload.start").on("upload.start",function(){var a=t(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=t.extend({},i,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=t(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];e.fileLength=t.length,o(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},o.render=function(e){var t=new p(e);return l.call(t)},e(r,o)}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/laypage.js b/len-sys/src/main/resources/plugin/layuitree/layui/laypage/laypage.js deleted file mode 100644 index 5c21dea..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/laypage.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";function e(r){var n="laypagecss";e.dir="dir"in e?e.dir:s.getpath+"/skin/laypage.css",new s(r),e.dir&&!t[a](n)&&s.use(e.dir,n)}e.v="1.3";var t=document,a="getElementById",r="getElementsByTagName",n=0,s=function(e){var t=this,a=t.config=e||{};a.item=n++,t.render(!0)};s.on=function(e,t,a){return e.attachEvent?e.attachEvent("on"+t,function(){a.call(e,window.even)}):e.addEventListener(t,a,!1),s},s.getpath=function(){var e=document.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),s.use=function(a,n){var s=t.createElement("link");s.type="text/css",s.rel="stylesheet",s.href=e.dir,n&&(s.id=n),t[r]("head")[0].appendChild(s),s=null},s.prototype.type=function(){var e=this.config;return"object"==typeof e.cont?void 0===e.cont.length?2:3:void 0},s.prototype.view=function(){var t=this,a=t.config,r=[],n={};if(a.pages=0|a.pages,a.curr=0|a.curr||1,a.groups="groups"in a?0|a.groups:5,a.first="first"in a?a.first:"首页",a.last="last"in a?a.last:"尾页",a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页",a.pages<=1)return"";for(a.groups>a.pages&&(a.groups=a.pages),n.index=Math.ceil((a.curr+(a.groups>1&&a.groups!==a.pages?1:0))/(0===a.groups?1:a.groups)),a.curr>1&&a.prev&&r.push(''+a.prev+""),n.index>1&&a.first&&0!==a.groups&&r.push(''+a.first+""),n.poor=Math.floor((a.groups-1)/2),n.start=n.index>1?a.curr-n.poor:1,n.end=n.index>1?function(){var e=a.curr+(a.groups-n.poor-1);return e>a.pages?a.pages:e}():a.groups,n.end-n.start"+n.start+"":''+n.start+"");return a.pages>a.groups&&n.end'+a.last+""),n.flow=!a.prev&&0===a.groups,(a.curr!==a.pages&&a.next||n.flow)&&r.push(function(){return n.flow&&a.curr===a.pages?''+a.next+"":''+a.next+""}()),'
        '+r.join("")+function(){return a.skip?'':""}()+"
        "},s.prototype.jump=function(e){if(e){for(var t=this,a=t.config,n=e.children,p=e[r]("button")[0],i=e[r]("input")[0],o=0,u=n.length;u>o;o++)"a"===n[o].nodeName.toLowerCase()&&s.on(n[o],"click",function(){var e=0|this.getAttribute("data-page");a.curr=e,t.render()});p&&s.on(p,"click",function(){var e=0|i.value.replace(/\s|\D/g,"");e&&e<=a.pages&&(a.curr=e,t.render())})}},s.prototype.render=function(e){var r=this,n=r.config,s=r.type(),p=r.view();2===s?n.cont.innerHTML=p:3===s?n.cont.html(p):t[a](n.cont).innerHTML=p,n.jump&&n.jump(n,e),r.jump(t[a]("laypage_"+n.item)),n.hash&&!e&&(location.hash="!"+n.hash+"="+n.curr)},"function"==typeof define?define(function(){return e}):"undefined"!=typeof exports?module.exports=e:window.laypage=e}(); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/paging.js b/len-sys/src/main/resources/plugin/layuitree/layui/laypage/paging.js deleted file mode 100644 index b27bb92..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/paging.js +++ /dev/null @@ -1 +0,0 @@ -layui.define(["layer","laypage","laytpl"],function(e){"use strict";function r(e){throw new Error(e)}var t=layui.jquery,a=void 0===parent.layui.layer?layui.layer:parent.layui.layer,n=layui.laytpl,i=function(){this.config={url:void 0,type:"POST",elem:void 0,params:{},openWait:!1,tempElem:void 0,tempType:0,paged:!0,pageConfig:{elem:void 0,pageSize:15},success:void 0,fail:function(e){a.msg(e,{icon:2})},complate:void 0,serverError:function(e){r("错误提示: "+e.status+" "+e.statusText)}}};i.prototype.v="1.0.2",i.prototype.set=function(e){var r=this;return t.extend(!0,r.config,e),r},i.prototype.init=function(e){var a=this;t.extend(!0,a.config,e);var n=a.config;if(void 0===n.url&&r("Paging Error:请配置远程URL!"),void 0===n.elem&&r("Paging Error:请配置参数elem!"),0===t(n.elem).length&&r("Paging Error:找不到配置的容器elem!"),0===n.tempType&&(void 0===n.tempElem&&r("Paging Error:请配置参数tempElem!"),0===t(n.tempElem).length&&r("Paging Error:找不到配置的容器tempElem!")),n.paged){var i=n.pageConfig;void 0===i.elem&&r("Paging Error:请配置参数pageConfig.elem!")}return"GET"!==n.type.toUpperCase()&&"POST"!==n.type.toUpperCase()&&r("Paging Error:type参数配置出错,只支持GET或都POST"),a.get({pageIndex:1,pageSize:n.pageConfig.pageSize}),a},i.prototype.get=function(e){var i=this,o=i.config,p=void 0;o.openWait&&(p=a.load(2));var g={pageIndex:1,pageSize:o.pageConfig.pageSize};t.extend(!0,o.params,g,e),t.ajax({type:o.type,url:o.url,data:o.params,dataType:"json",success:function(e){if(e.rel){var g=0===o.tempType?t(o.tempElem).html():o.tempElem;if(n(g).render(e,function(e){o.renderBefore?o.renderBefore(e,function(e){t(o.elem).html(e)}):t(o.elem).html(e)}),o.paged){if(null===e.count||0===e.count)return void r("Paging Error:请返回数据总数!");var l=o.pageConfig,u=l.pageSize,c=e.count%u==0?e.count/u:e.count/u+1,m={cont:t(l.elem),curr:o.params.pageIndex,pages:c,jump:function(e,r){var t=e.curr;r||i.get({pageIndex:t,pageSize:u})}};t.extend(m,l),layui.laypage(m)}o.success&&o.success()}else o.fail&&o.fail(e);o.complate&&o.complate(),void 0!==p&&a.close(p)},error:function(e,r,t){void 0!==p&&a.close(p),o.serverError(e,r,t)}})};var o=new i;e("paging",function(e){return o.set(e)})}); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/skin/laypage.css b/len-sys/src/main/resources/plugin/layuitree/layui/laypage/skin/laypage.css deleted file mode 100644 index 82fe9bf..0000000 --- a/len-sys/src/main/resources/plugin/layuitree/layui/laypage/skin/laypage.css +++ /dev/null @@ -1,3 +0,0 @@ -/*! - laypage默认样式 -*/.laypage_main a,.laypage_main input,.laypage_main span{height:26px;line-height:26px}.laypage_main button,.laypage_main input,.laypageskin_default a{border:1px solid #ccc;background-color:#fff}.laypage_main{font-size:0;clear:both;color:#666}.laypage_main *{display:inline-block;vertical-align:top;font-size:12px}.laypage_main a{text-decoration:none;color:#666}.laypage_main a,.laypage_main span{margin:0 3px 6px;padding:0 10px}.laypage_main input{width:40px;margin:0 5px;padding:0 5px}.laypage_main button{height:28px;line-height:28px;margin-left:5px;padding:0 10px;color:#666}.laypageskin_default span{height:28px;line-height:28px;color:#999}.laypageskin_default .laypage_curr{font-weight:700;color:#666}.laypageskin_molv a,.laypageskin_molv span{padding:0 12px;border-radius:2px}.laypageskin_molv a{background-color:#f1eff0}.laypageskin_molv .laypage_curr{background-color:#00AA91;color:#fff}.laypageskin_molv input{height:24px;line-height:24px}.laypageskin_molv button{height:26px;line-height:26px}.laypageskin_yahei{color:#333}.laypageskin_yahei a,.laypageskin_yahei span{padding:0 13px;border-radius:2px;color:#333}.laypageskin_yahei .laypage_curr{background-color:#333;color:#fff}.laypageskin_flow{text-align:center}.laypageskin_flow .page_nomore{color:#999} \ No newline at end of file -- Gitee From ddea82f23a7ef6e822ad94221ae5307fd9f736f4 Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Thu, 24 Oct 2019 19:51:03 +0800 Subject: [PATCH 12/39] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/len/entity/SysDepart.java | 30 ++++++++++ .../java/com/len/entity/SysUserDepart.java | 55 +++++++++++++++++++ .../java/com/len/mapper/SysDepartMapper.java | 7 +++ .../com/len/mapper/SysUserDepartMapper.java | 8 +++ .../main/resources/mapper/SysDepartMapper.xml | 13 +++++ .../resources/mapper/SysUserDepartMapper.xml | 11 ++++ 6 files changed, 124 insertions(+) create mode 100644 len-sys/src/main/java/com/len/entity/SysDepart.java create mode 100644 len-sys/src/main/java/com/len/entity/SysUserDepart.java create mode 100644 len-sys/src/main/java/com/len/mapper/SysDepartMapper.java create mode 100644 len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java create mode 100644 len-sys/src/main/resources/mapper/SysDepartMapper.xml create mode 100644 len-sys/src/main/resources/mapper/SysUserDepartMapper.xml diff --git a/len-sys/src/main/java/com/len/entity/SysDepart.java b/len-sys/src/main/java/com/len/entity/SysDepart.java new file mode 100644 index 0000000..f6a8cf4 --- /dev/null +++ b/len-sys/src/main/java/com/len/entity/SysDepart.java @@ -0,0 +1,30 @@ +package com.len.entity; + +import lombok.Data; + +import javax.persistence.*; + +@Table(name = "sys_depart") +@Data +public class SysDepart { + @Id + @GeneratedValue(generator = "JDBC") + private String id; + + /** + * 编码 + */ + private String code; + + /** + * 父级id + */ + @Column(name = "parent_id") + private String parentId; + + /** + * 部门名称 + */ + @Column(name = "depart_name") + private String departName; +} \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysUserDepart.java b/len-sys/src/main/java/com/len/entity/SysUserDepart.java new file mode 100644 index 0000000..989a631 --- /dev/null +++ b/len-sys/src/main/java/com/len/entity/SysUserDepart.java @@ -0,0 +1,55 @@ +package com.len.entity; + +import javax.persistence.*; + +@Table(name = "sys_user_depart") +public class SysUserDepart { + /** + * 用户id + */ + @Id + @Column(name = "user_id") + private String userId; + + /** + * 部门id + */ + @Column(name = "depart_id") + private String departId; + + /** + * 获取用户id + * + * @return user_id - 用户id + */ + public String getUserId() { + return userId; + } + + /** + * 设置用户id + * + * @param userId 用户id + */ + public void setUserId(String userId) { + this.userId = userId == null ? null : userId.trim(); + } + + /** + * 获取部门id + * + * @return depart_id - 部门id + */ + public String getDepartId() { + return departId; + } + + /** + * 设置部门id + * + * @param departId 部门id + */ + public void setDepartId(String departId) { + this.departId = departId == null ? null : departId.trim(); + } +} \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java b/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java new file mode 100644 index 0000000..a804ad2 --- /dev/null +++ b/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java @@ -0,0 +1,7 @@ +package com.len.mapper; + +import com.len.base.BaseMapper; +import com.len.entity.SysDepart; + +public interface SysDepartMapper extends BaseMapper { +} \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java b/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java new file mode 100644 index 0000000..e5a6bd2 --- /dev/null +++ b/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java @@ -0,0 +1,8 @@ +package com.len.mapper; + +import com.len.base.BaseMapper; +import com.len.entity.SysUserDepart; +import tk.mybatis.mapper.common.Mapper; + +public interface SysUserDepartMapper extends BaseMapper { +} \ No newline at end of file diff --git a/len-sys/src/main/resources/mapper/SysDepartMapper.xml b/len-sys/src/main/resources/mapper/SysDepartMapper.xml new file mode 100644 index 0000000..5aae349 --- /dev/null +++ b/len-sys/src/main/resources/mapper/SysDepartMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/len-sys/src/main/resources/mapper/SysUserDepartMapper.xml b/len-sys/src/main/resources/mapper/SysUserDepartMapper.xml new file mode 100644 index 0000000..2c4fadc --- /dev/null +++ b/len-sys/src/main/resources/mapper/SysUserDepartMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file -- Gitee From 6d07d3213b02ec52a2239a148308085d35b93dc3 Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Thu, 24 Oct 2019 21:34:24 +0800 Subject: [PATCH 13/39] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81UI=E3=80=81?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BC=98=E5=8C=96=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../len/controller/ActivitiController.java | 56 +- .../impl/DefaultProcessDiagramCanvas.java | 235 +- .../org/activiti/rest/ActivitiService.java | 182 + .../activiti/rest/model/ActivitiProcess.java | 30 + .../resources/ftl/act/activiti/shinePics.html | 106 + .../resources/ftl/act/leave/leaveList.ftl | 13 +- .../resources/ftl/act/leave/shinePics.ftl | 62 - .../src/main/resources/ftl/actModelList.ftl | 18 +- .../main/resources/mapper/UserLeaveMapper.xml | 1 + .../src/main/resources/plugin/activiti.js | 29 + .../properties-assignment-controller.js | 184 +- .../properties/assignment-candidateGroup.html | 68 +- .../properties/assignment-popup-popup.html | 12 +- .../static/editor-app/css/style-common.css | 85 +- .../static/editor-app/css/style-editor.css | 271 +- .../resources/static/editor-app/editor.html | 31 +- .../static/editor-app/editor/oryx.debug.js | 8122 ++++++++--------- .../libs/bootstrap_3.1.1/css/bootstrap.css | 2 +- .../src/main/resources/static/modeler.html | 236 +- .../src/main/resources/stencilset.json | 178 +- 20 files changed, 5138 insertions(+), 4783 deletions(-) create mode 100644 len-activiti/src/main/java/org/activiti/rest/ActivitiService.java create mode 100644 len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java create mode 100644 len-activiti/src/main/resources/ftl/act/activiti/shinePics.html delete mode 100644 len-activiti/src/main/resources/ftl/act/leave/shinePics.ftl create mode 100644 len-activiti/src/main/resources/plugin/activiti.js diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java index 25c12c2..e07f4f9 100644 --- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java +++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java @@ -15,6 +15,8 @@ */ package com.len.controller; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -26,6 +28,7 @@ import com.len.service.ActAssigneeService; import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.service.SysUserService; +import com.len.util.Base64Utils; import com.len.util.Checkbox; import com.len.util.LenResponse; import com.len.util.ReType; @@ -36,7 +39,6 @@ import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.IdentityService; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; -import org.activiti.engine.TaskService; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.persistence.entity.GroupEntity; @@ -46,19 +48,20 @@ import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ModelQuery; import org.activiti.engine.repository.ProcessDefinitionQuery; +import org.activiti.rest.ActivitiService; +import org.activiti.rest.model.ActivitiProcess; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author zhuxiaomeng @@ -96,7 +99,7 @@ public class ActivitiController extends BaseController { private ActAssigneeService actAssigneeService; @Autowired - private TaskService taskService; + ActivitiService activitiService; /** @@ -108,7 +111,7 @@ public class ActivitiController extends BaseController { LenResponse j = new LenResponse(); try { List userList = userService.selectListByPage(new SysUser()); - User au = null; + User au; for (SysUser user : userList) { au = new UserEntity(); au.setId(user.getId()); @@ -118,7 +121,7 @@ public class ActivitiController extends BaseController { identityService.saveUser(au); } List sysRoleList = roleService.selectListByPage(new SysRole()); - Group group = null; + Group group; for (SysRole role : sysRoleList) { group = new GroupEntity(); group.setId(role.getId()); @@ -410,6 +413,43 @@ public class ActivitiController extends BaseController { @Autowired ActPropertiesConfig actPropertiesConfig; + @GetMapping("shinePics/{processInstanceId}") + public String shinePics(org.springframework.ui.Model model, @PathVariable String processInstanceId) { + model.addAttribute("processInstanceId", processInstanceId); + return "/act/activiti/shinePics"; + } + + @GetMapping("getShineProcImage") + @ResponseBody + public JSONObject getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId) + throws IOException { + JSONObject result = new JSONObject(); + JSONArray shineProImages = new JSONArray(); + InputStream imageStream = activitiService.generateStream(processInstanceId, true); + if (imageStream != null) { + String imageCurrentNode = Base64Utils.ioToBase64(imageStream); + if (StringUtils.isNotBlank(imageCurrentNode)) { + shineProImages.add(imageCurrentNode); + } + } + InputStream imageNoCurrentStream = activitiService.generateStream(processInstanceId, false); + if (imageNoCurrentStream != null) { + String imageNoCurrentNode = Base64Utils.ioToBase64(imageNoCurrentStream); + if (StringUtils.isNotBlank(imageNoCurrentNode)) { + shineProImages.add(imageNoCurrentNode); + } + } + + List taskSqu = activitiService.getTaskSqu(processInstanceId); + + + result.put("id", UUID.randomUUID().toString()); + result.put("errorNo", 0); + result.put("images", shineProImages); + result.put("taskSqu", taskSqu); + return result; + } + @PostMapping("delModel") @ResponseBody public LenResponse delModel(org.springframework.ui.Model model, String id) { diff --git a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java index 134c970..a97f60e 100644 --- a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java +++ b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java @@ -1,9 +1,9 @@ /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -57,10 +57,10 @@ import org.slf4j.LoggerFactory; /** * Represents a canvas on which BPMN 2.0 constructs can be drawn. - * + * * Some of the icons used are licensed under a Creative Commons Attribution 2.5 * License, see http://www.famfamfam.com/lab/icons/silk/ - * + * * @see org.activiti.engine.impl.bpmn.diagram.DefaultProcessDiagramGenerator * @author Joram Barrez */ @@ -79,7 +79,7 @@ public class DefaultProcessDiagramCanvas { protected static final int TEXT_PADDING = 3; protected static final int ANNOTATION_TEXT_PADDING = 7; protected static final int LINE_HEIGHT = FONT_SIZE + FONT_SPACING; - + // Colors protected static Color TASK_BOX_COLOR = new Color(249, 249, 249); @@ -92,7 +92,7 @@ public class DefaultProcessDiagramCanvas { protected static Color TASK_BORDER_COLOR = new Color(187, 187, 187); protected static Color EVENT_BORDER_COLOR = new Color(88, 88, 88); protected static Color SUBPROCESS_BORDER_COLOR = new Color(0, 0, 0); - + // Fonts protected static Font LABEL_FONT = null; protected static Font ANNOTATION_FONT = null; @@ -120,7 +120,7 @@ public class DefaultProcessDiagramCanvas { protected static BufferedImage SHELL_TASK_IMAGE; protected static BufferedImage MULE_TASK_IMAGE; protected static BufferedImage CAMEL_TASK_IMAGE; - + protected static BufferedImage TIMER_IMAGE; protected static BufferedImage COMPENSATE_THROW_IMAGE; protected static BufferedImage COMPENSATE_CATCH_IMAGE; @@ -143,19 +143,19 @@ public class DefaultProcessDiagramCanvas { protected String activityFontName = "Arial"; protected String labelFontName = "Arial"; protected String annotationFontName = "Arial"; - + /** * Creates an empty canvas with given width and height. - * + * * Allows to specify minimal boundaries on the left and upper side of the * canvas. This is useful for diagrams that have white space there. - * Everything beneath these minimum values will be cropped. + * Everything beneath these minimum values will be cropped. * It's also possible to pass a specific font name and a class loader for the icon images. - * + * */ - public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, + public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { - + this.canvasWidth = width; this.canvasHeight = height; this.minX = minX; @@ -170,17 +170,17 @@ public class DefaultProcessDiagramCanvas { this.annotationFontName = annotationFontName; } this.customClassLoader = customClassLoader; - + initialize(imageType); } /** * Creates an empty canvas with given width and height. - * + * * Allows to specify minimal boundaries on the left and upper side of the * canvas. This is useful for diagrams that have white space there (eg * Signavio). Everything beneath these minimum values will be cropped. - * + * * @param minX * Hint that will be used when generating the image. Parts that fall * below minX on the horizontal scale will be cropped. @@ -193,17 +193,17 @@ public class DefaultProcessDiagramCanvas { this.canvasHeight = height; this.minX = minX; this.minY = minY; - + initialize(imageType); } - + public void initialize(String imageType) { if ("png".equalsIgnoreCase(imageType)) { this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB); } else { this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB); } - + this.g = processDiagram.createGraphics(); if ("png".equalsIgnoreCase(imageType) == false) { this.g.setBackground(new Color(255, 255, 255, 0)); @@ -212,14 +212,14 @@ public class DefaultProcessDiagramCanvas { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(Color.black); - + Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE); g.setFont(font); this.fontMetrics = g.getFontMetrics(); LABEL_FONT = new Font(labelFontName, Font.BOLD, 14); ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE); - + try { USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/userTask.png", customClassLoader)); SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/scriptTask.png", customClassLoader)); @@ -231,7 +231,7 @@ public class DefaultProcessDiagramCanvas { SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/shellTask.png", customClassLoader)); CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/camelTask.png", customClassLoader)); MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/muleTask.png", customClassLoader)); - + TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/timer.png", customClassLoader)); COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate-throw.png", customClassLoader)); COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate.png", customClassLoader)); @@ -248,7 +248,7 @@ public class DefaultProcessDiagramCanvas { /** * Generates an image of what currently is drawn on the canvas. - * + * * Throws an {@link ActivitiException} when {@link #close()} is already * called. */ @@ -260,7 +260,7 @@ public class DefaultProcessDiagramCanvas { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ImageIO.write(processDiagram, imageType, out); - + } catch (IOException e) { throw new ActivitiImageException("Error while generating process image", e); } finally { @@ -274,10 +274,10 @@ public class DefaultProcessDiagramCanvas { } return new ByteArrayInputStream(out.toByteArray()); } - + /** * Generates an image of what currently is drawn on the canvas. - * + * * Throws an {@link ActivitiException} when {@link #close()} is already * called. */ @@ -312,11 +312,11 @@ public class DefaultProcessDiagramCanvas { public void drawTimerStartEvent(GraphicInfo graphicInfo, double scaleFactor) { drawStartEvent(graphicInfo, TIMER_IMAGE, scaleFactor); } - + public void drawSignalStartEvent(GraphicInfo graphicInfo, double scaleFactor) { drawStartEvent(graphicInfo, SIGNAL_CATCH_IMAGE, scaleFactor); } - + public void drawMessageStartEvent(GraphicInfo graphicInfo, double scaleFactor) { drawStartEvent(graphicInfo, MESSAGE_CATCH_IMAGE, scaleFactor); } @@ -325,7 +325,7 @@ public class DefaultProcessDiagramCanvas { Paint originalPaint = g.getPaint(); g.setPaint(EVENT_COLOR); // g.setPaint(new Color(36,202,88)); - Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); g.fill(circle); g.setPaint(EVENT_BORDER_COLOR); @@ -334,7 +334,7 @@ public class DefaultProcessDiagramCanvas { if (image != null) { // calculate coordinates to center image int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); - int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); + int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); } @@ -344,9 +344,8 @@ public class DefaultProcessDiagramCanvas { public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) { Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); -// g.setPaint(EVENT_COLOR); - g.setPaint(new Color(255,0,0)); - Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + g.setPaint(new Color(255,255,255)); + Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); g.fill(circle); g.setPaint(EVENT_BORDER_COLOR); @@ -366,28 +365,28 @@ public class DefaultProcessDiagramCanvas { drawLabel(name, graphicInfo); } } - + public void drawErrorEndEvent(GraphicInfo graphicInfo, double scaleFactor) { drawNoneEndEvent(graphicInfo, scaleFactor); - g.drawImage(ERROR_THROW_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), - (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), - (int) (ERROR_THROW_IMAGE.getWidth() / scaleFactor), + g.drawImage(ERROR_THROW_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), + (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), + (int) (ERROR_THROW_IMAGE.getWidth() / scaleFactor), (int) (ERROR_THROW_IMAGE.getHeight() / scaleFactor), null); } - + public void drawErrorStartEvent(GraphicInfo graphicInfo, double scaleFactor) { drawNoneStartEvent(graphicInfo); - g.drawImage(ERROR_CATCH_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), - (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), - (int) (ERROR_CATCH_IMAGE.getWidth() / scaleFactor), + g.drawImage(ERROR_CATCH_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)), + (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)), + (int) (ERROR_CATCH_IMAGE.getWidth() / scaleFactor), (int) (ERROR_CATCH_IMAGE.getHeight() / scaleFactor), null); } - public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting, + public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting, BufferedImage image, String eventType, double scaleFactor) { - + // event circles - Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), + Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); int innerCircleSize = (int) (4 / scaleFactor); if (innerCircleSize == 0) { @@ -405,7 +404,7 @@ public class DefaultProcessDiagramCanvas { g.fill(outerCircle); g.setPaint(EVENT_BORDER_COLOR); - if (isInterrupting == false) + if (isInterrupting == false) g.setStroke(NON_INTERRUPTING_EVENT_STROKE); g.draw(outerCircle); g.setStroke(originalStroke); @@ -415,13 +414,13 @@ public class DefaultProcessDiagramCanvas { if (image != null) { // calculate coordinates to center image int imageX = (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor)); - int imageY = (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); + int imageY = (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor)); if (scaleFactor == 1.0 && "timer".equals(eventType)) { // move image one pixel to center timer image imageX++; imageY++; } - g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), + g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null); } } @@ -461,7 +460,7 @@ public class DefaultProcessDiagramCanvas { public void drawCatchingSignalEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { drawCatchingEvent(graphicInfo, isInterrupting, SIGNAL_CATCH_IMAGE, "signal", scaleFactor); } - + public void drawCatchingMessageEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) { drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); } @@ -470,7 +469,7 @@ public class DefaultProcessDiagramCanvas { drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor); drawLabel(name, graphicInfo); } - + public void drawThrowingCompensateEvent(GraphicInfo graphicInfo, double scaleFactor) { drawCatchingEvent(graphicInfo, true, COMPENSATE_THROW_IMAGE, "compensate", scaleFactor); } @@ -478,7 +477,7 @@ public class DefaultProcessDiagramCanvas { public void drawThrowingSignalEvent(GraphicInfo graphicInfo, double scaleFactor) { drawCatchingEvent(graphicInfo, true, SIGNAL_THROW_IMAGE, "signal", scaleFactor); } - + public void drawThrowingNoneEvent(GraphicInfo graphicInfo, double scaleFactor) { drawCatchingEvent(graphicInfo, true, null, "none", scaleFactor); } @@ -486,7 +485,7 @@ public class DefaultProcessDiagramCanvas { public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, double scaleFactor) { drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor); } - + public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) { Paint originalPaint = g.getPaint(); if (highLighted) @@ -512,10 +511,10 @@ public class DefaultProcessDiagramCanvas { public void drawSequenceflow(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, boolean highLighted, double scaleFactor) { drawConnection(xPoints, yPoints, conditional, isDefault, "sequenceFlow", AssociationDirection.ONE, highLighted, scaleFactor); } - - public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, + + public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) { - + Paint originalPaint = g.getPaint(); Stroke originalStroke = g.getStroke(); @@ -535,7 +534,7 @@ public class DefaultProcessDiagramCanvas { Line2D.Double line = new Line2D.Double(sourceX, sourceY, targetX, targetY); g.draw(line); } - + if (isDefault){ Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawDefaultSequenceFlowIndicator(line, scaleFactor); @@ -545,7 +544,7 @@ public class DefaultProcessDiagramCanvas { Line2D.Double line = new Line2D.Double(xPoints[0], yPoints[0], xPoints[1], yPoints[1]); drawConditionalSequenceFlowIndicator(line, scaleFactor); } - + if (associationDirection.equals(AssociationDirection.ONE) || associationDirection.equals(AssociationDirection.BOTH)) { Line2D.Double line = new Line2D.Double(xPoints[xPoints.length-2], yPoints[xPoints.length-2], xPoints[xPoints.length-1], yPoints[xPoints.length-1]); drawArrowHead(line, scaleFactor); @@ -660,22 +659,22 @@ public class DefaultProcessDiagramCanvas { public void drawTask(BufferedImage icon, String name, GraphicInfo graphicInfo, double scaleFactor) { drawTask(name, graphicInfo); - g.drawImage(icon, (int) (graphicInfo.getX() + ICON_PADDING / scaleFactor), - (int) (graphicInfo.getY() + ICON_PADDING / scaleFactor), + g.drawImage(icon, (int) (graphicInfo.getX() + ICON_PADDING / scaleFactor), + (int) (graphicInfo.getY() + ICON_PADDING / scaleFactor), (int) (icon.getWidth() / scaleFactor), (int) (icon.getHeight() / scaleFactor), null); } public void drawTask(String name, GraphicInfo graphicInfo) { drawTask(name, graphicInfo, false); } - + public void drawPoolOrLane(String name, GraphicInfo graphicInfo) { int x = (int) graphicInfo.getX(); int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); g.drawRect(x, y, width, height); - + // Add the name as text, vertical if(name != null && name.length() > 0) { // Include some padding @@ -689,10 +688,10 @@ public class DefaultProcessDiagramCanvas { Font currentFont = g.getFont(); Font theDerivedFont = currentFont.deriveFont(transformation); g.setFont(theDerivedFont); - + String truncated = fitTextToWidth(name, availableTextSpace); int realWidth = fontMetrics.stringWidth(truncated); - + g.drawString(truncated, x + 2 + fontMetrics.getHeight(), 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2); g.setFont(currentFont); } @@ -704,14 +703,14 @@ public class DefaultProcessDiagramCanvas { int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); - + // Create a new gradient paint for every task box, gradient depends on x and y and is not relative // g.setPaint(TASK_BOX_COLOR); - g.setPaint(new Color(255,255,0)); + g.setPaint(new Color(144,238,144)); int arcR = 6; if (thickBorder) arcR = 3; - + // shape RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR); g.fill(rect); @@ -733,11 +732,11 @@ public class DefaultProcessDiagramCanvas { int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; int boxX = x + width/2 - boxWidth/2; int boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2; - + drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight); } } - + protected void drawMultilineCentredText(String text, int x, int y, int boxWidth, int boxHeight) { drawMultilineText(text, x, y, boxWidth, boxHeight, true); } @@ -745,38 +744,38 @@ public class DefaultProcessDiagramCanvas { protected void drawMultilineAnnotationText(String text, int x, int y, int boxWidth, int boxHeight) { drawMultilineText(text, x, y, boxWidth, boxHeight, false); } - + protected void drawMultilineText(String text, int x, int y, int boxWidth, int boxHeight, boolean centered) { // Create an attributed string based in input text AttributedString attributedString = new AttributedString(text); attributedString.addAttribute(TextAttribute.FONT, g.getFont()); attributedString.addAttribute(TextAttribute.FOREGROUND, Color.black); - + AttributedCharacterIterator characterIterator = attributedString.getIterator(); - + int currentHeight = 0; // Prepare a list of lines of text we'll be drawing List layouts = new ArrayList(); String lastLine = null; - + LineBreakMeasurer measurer = new LineBreakMeasurer(characterIterator, g.getFontRenderContext()); - + TextLayout layout = null; while (measurer.getPosition() < characterIterator.getEndIndex() && currentHeight <= boxHeight) { - + int previousPosition = measurer.getPosition(); - + // Request next layout layout = measurer.nextLayout(boxWidth); - + int height = ((Float)(layout.getDescent() + layout.getAscent() + layout.getLeading())).intValue(); - + if(currentHeight + height > boxHeight) { // The line we're about to add should NOT be added anymore, append three dots to previous one instead // to indicate more text is truncated if (!layouts.isEmpty()) { layouts.remove(layouts.size() - 1); - + if(lastLine.length() >= 4) { lastLine = lastLine.substring(0, lastLine.length() - 4) + "..."; } @@ -789,23 +788,23 @@ public class DefaultProcessDiagramCanvas { currentHeight += height; } } - - + + int currentY = y + (centered ? ((boxHeight - currentHeight) /2) : 0); int currentX = 0; - + // Actually draw the lines for(TextLayout textLayout : layouts) { - + currentY += textLayout.getAscent(); currentX = x + (centered ? ((boxWidth - ((Double)textLayout.getBounds().getWidth()).intValue()) /2) : 0); - + textLayout.draw(g, currentX, currentY); currentY += textLayout.getDescent() + textLayout.getLeading(); } - + } - + protected String fitTextToWidth(String original, int width) { String text = original; @@ -847,23 +846,23 @@ public class DefaultProcessDiagramCanvas { public void drawManualTask(String name, GraphicInfo graphicInfo, double scaleFactor) { drawTask(MANUALTASK_IMAGE, name, graphicInfo, scaleFactor); } - + public void drawBusinessRuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { drawTask(BUSINESS_RULE_TASK_IMAGE, name, graphicInfo, scaleFactor); } - + public void drawCamelTask(String name, GraphicInfo graphicInfo, double scaleFactor) { drawTask(CAMEL_TASK_IMAGE, name, graphicInfo, scaleFactor); } - + public void drawMuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) { drawTask(MULE_TASK_IMAGE, name, graphicInfo, scaleFactor); } public void drawExpandedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent, double scaleFactor) { - RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), + RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight(), 8, 8); - + // Use different stroke (dashed) if (isTriggeredByEvent) { Stroke originalStroke = g.getStroke(); @@ -939,7 +938,7 @@ public class DefaultProcessDiagramCanvas { int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); - + rhombus.addPoint(x, y + (height / 2)); rhombus.addPoint(x + (width / 2), y + height); rhombus.addPoint(x + width, y + (height / 2)); @@ -1009,39 +1008,39 @@ public class DefaultProcessDiagramCanvas { g.setStroke(orginalStroke); } } - + public void drawEventBasedGateway(GraphicInfo graphicInfo, double scaleFactor) { // rhombus drawGateway(graphicInfo); - + if (scaleFactor == 1.0) { int x = (int) graphicInfo.getX(); int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); - + double scale = .6; - + GraphicInfo eventInfo = new GraphicInfo(); eventInfo.setX(x + width*(1-scale)/2); eventInfo.setY(y + height*(1-scale)/2); eventInfo.setWidth(width*scale); eventInfo.setHeight(height*scale); drawCatchingEvent(eventInfo, true, null, "eventGateway", scaleFactor); - + double r = width / 6.; - + // create pentagon (coords with respect to center) int topX = (int)(.95 * r); // top right corner int topY = (int)(-.31 * r); int bottomX = (int)(.59 * r); // bottom right corner int bottomY = (int)(.81 * r); - + int[] xPoints = new int[]{ 0, topX, bottomX, -bottomX, -topX }; int[] yPoints = new int[]{ -(int)r, topY, bottomY, bottomY, topY }; Polygon pentagon = new Polygon(xPoints, yPoints, 5); pentagon.translate(x+width/2, y+width/2); - + // draw g.drawPolygon(pentagon); } @@ -1105,12 +1104,12 @@ public class DefaultProcessDiagramCanvas { int y = (int) graphicInfo.getY(); int width = (int) graphicInfo.getWidth(); int height = (int) graphicInfo.getHeight(); - + Font originalFont = g.getFont(); Stroke originalStroke = g.getStroke(); - + g.setFont(ANNOTATION_FONT); - + Path2D path = new Path2D.Double(); x += .5; int lineLength = 18; @@ -1118,35 +1117,35 @@ public class DefaultProcessDiagramCanvas { path.lineTo(x, y); path.lineTo(x, y + height); path.lineTo(x + lineLength, y + height); - + path.lineTo(x + lineLength, y + height -1); path.lineTo(x + 1, y + height -1); path.lineTo(x + 1, y + 1); path.lineTo(x + lineLength, y + 1); path.closePath(); - + g.draw(path); - + int boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); int boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); int boxX = x + width/2 - boxWidth/2; int boxY = y + height/2 - boxHeight/2; - + if (text != null && text.isEmpty() == false) { drawMultilineAnnotationText(text, boxX, boxY, boxWidth, boxHeight); } - + // restore originals g.setFont(originalFont); g.setStroke(originalStroke); } - + public void drawLabel(String text, GraphicInfo graphicInfo){ drawLabel(text, graphicInfo, true); } public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered){ float interline = 1.0f; - + // text if (text != null && text.length()>0) { Paint originalPaint = g.getPaint(); @@ -1157,7 +1156,7 @@ public class DefaultProcessDiagramCanvas { int wrapWidth = 100; int textY = (int) graphicInfo.getY(); - + // TODO: use drawMultilineText() AttributedString as = new AttributedString(text); as.addAttribute(TextAttribute.FOREGROUND, g.getPaint()); @@ -1165,7 +1164,7 @@ public class DefaultProcessDiagramCanvas { AttributedCharacterIterator aci = as.getIterator(); FontRenderContext frc = new FontRenderContext(null, true, false); LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); - + while (lbm.getPosition() < text.length()) { TextLayout tl = lbm.nextLayout(wrapWidth); textY += tl.getAscent(); @@ -1177,7 +1176,7 @@ public class DefaultProcessDiagramCanvas { tl.draw(g, (float) tX, textY); textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent(); } - + // restore originals g.setFont(originalFont); g.setPaint(originalPaint); @@ -1191,7 +1190,7 @@ public class DefaultProcessDiagramCanvas { * @param sourceGraphicInfo * @param targetGraphicInfo * @param graphicInfoList - * + * */ public List connectionPerfectionizer(SHAPE_TYPE sourceShapeType, SHAPE_TYPE targetShapeType, GraphicInfo sourceGraphicInfo, GraphicInfo targetGraphicInfo, List graphicInfoList) { Shape shapeFirst = createShape(sourceShapeType, sourceGraphicInfo); @@ -1208,9 +1207,9 @@ public class DefaultProcessDiagramCanvas { graphicInfoLast.setX(shapeLast.getBounds2D().getCenterX()); graphicInfoLast.setY(shapeLast.getBounds2D().getCenterY()); } - + Point p = null; - + if (shapeFirst != null) { Line2D.Double lineFirst = new Line2D.Double(graphicInfoFirst.getX(), graphicInfoFirst.getY(), graphicInfoList.get(1).getX(), graphicInfoList.get(1).getY()); p = getIntersection(shapeFirst, lineFirst); @@ -1219,7 +1218,7 @@ public class DefaultProcessDiagramCanvas { graphicInfoFirst.setY(p.getY()); } } - + if (shapeLast != null) { Line2D.Double lineLast = new Line2D.Double(graphicInfoLast.getX(), graphicInfoLast.getY(), graphicInfoList.get(graphicInfoList.size()-2).getX(), graphicInfoList.get(graphicInfoList.size()-2).getY()); p = getIntersection(shapeLast, lineLast); @@ -1242,7 +1241,7 @@ public class DefaultProcessDiagramCanvas { private static Shape createShape(SHAPE_TYPE shapeType, GraphicInfo graphicInfo) { if (SHAPE_TYPE.Rectangle.equals(shapeType)) { // source is rectangle - return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); + return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight()); } else if (SHAPE_TYPE.Rhombus.equals(shapeType)) { // source is rhombus Path2D.Double rhombus = new Path2D.Double(); @@ -1264,7 +1263,7 @@ public class DefaultProcessDiagramCanvas { /** * This method returns intersection point of shape border and line. - * + * * @param shape * @param line * @return Point @@ -1298,7 +1297,7 @@ public class DefaultProcessDiagramCanvas { /** * This method calculates shape intersection with line. - * + * * @param shape * @param line * @return Intersection point diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java new file mode 100644 index 0000000..9fe74d8 --- /dev/null +++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java @@ -0,0 +1,182 @@ +package org.activiti.rest; + +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.engine.*; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.identity.User; +import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.activiti.engine.impl.context.Context; +import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.activiti.engine.impl.pvm.PvmTransition; +import org.activiti.engine.impl.pvm.process.ActivityImpl; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.image.HMProcessDiagramGenerator; +import org.activiti.rest.model.ActivitiProcess; +import org.activiti.spring.ProcessEngineFactoryBean; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author zhuxiaomeng + * @date 2019-03-10. + * @email 154040976@qq.com + */ +@Service +public class ActivitiService { + + @Autowired + RuntimeService runtimeService; + + @Autowired + TaskService taskService; + + @Autowired + IdentityService identityService; + + @Autowired + RepositoryService repositoryService; + + @Autowired + ProcessEngineFactoryBean processEngine; + + @Autowired + ProcessEngineConfiguration processEngineConfiguration; + + @Autowired + HistoryService historyService; + + static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-hh mm:ss"); + + /** + * 获取需要高亮的线 + * + * @param processDefinitionEntity + * @param historicActivityInstances + * @return + */ + private List getHighLightedFlows( + ProcessDefinitionEntity processDefinitionEntity, + List historicActivityInstances) { + + List highFlows = new ArrayList(); + + for (int i = 0; i < historicActivityInstances.size() - 1; i++) { + ActivityImpl activityImpl = processDefinitionEntity + .findActivity(historicActivityInstances.get(i) + .getActivityId()); + List sameStartTimeNodes = new ArrayList(); + ActivityImpl sameActivityImpl1 = processDefinitionEntity + .findActivity(historicActivityInstances.get(i + 1) + .getActivityId()); + sameStartTimeNodes.add(sameActivityImpl1); + + for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { + HistoricActivityInstance activityImpl1 = historicActivityInstances + .get(j); + HistoricActivityInstance activityImpl2 = historicActivityInstances + .get(j + 1); + + if (activityImpl1.getStartTime().equals( + activityImpl2.getStartTime())) { + + ActivityImpl sameActivityImpl2 = processDefinitionEntity + .findActivity(activityImpl2.getActivityId()); + sameStartTimeNodes.add(sameActivityImpl2); + + } else { + break; + } + } + List pvmTransitions = activityImpl + .getOutgoingTransitions(); + for (PvmTransition pvmTransition : pvmTransitions) { + ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition + .getDestination(); + if (sameStartTimeNodes.contains(pvmActivityImpl)) { + Map properties = pvmActivityImpl.getProperties(); + System.out.println(properties); + highFlows.add(pvmTransition.getId()); + } + } + } + return highFlows; + } + + public List getTaskSqu(String processInstanceId) { + List list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId) + .list(); + List activitiProcesses = new ArrayList<>(); + + list.forEach(s -> { + String assignee = s.getAssignee(); + ActivitiProcess activitiProcess = new ActivitiProcess(); + activitiProcess.setUserId(assignee); + User user = identityService.createUserQuery().userId(assignee).singleResult(); + activitiProcess.setUserName(user.getFirstName()); + activitiProcess.setSid(s.getTaskDefinitionKey()); + activitiProcess.setTaskName(s.getName()); + activitiProcess.setTime(simpleDateFormat.format(s.getStartTime())); + activitiProcesses.add(activitiProcess); + }); + return activitiProcesses; + } + + public InputStream generateStream(String processInstanceId, boolean needCurrent) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + HistoricProcessInstance historicProcessInstance = + historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + String processDefinitionId = null; + List executedActivityIdList = new ArrayList(); + List currentActivityIdList = new ArrayList<>(); + List historicActivityInstanceList = new ArrayList<>(); + if (processInstance != null) { + processDefinitionId = processInstance.getProcessDefinitionId(); + if (needCurrent) { + currentActivityIdList = this.runtimeService.getActiveActivityIds(processInstance.getId()); + } + } + if (historicProcessInstance != null) { + processDefinitionId = historicProcessInstance.getProcessDefinitionId(); + historicActivityInstanceList = + historyService.createHistoricActivityInstanceQuery().finished().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list(); + for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { + executedActivityIdList.add(activityInstance.getActivityId()); + } + } + + if (StringUtils.isEmpty(processDefinitionId) || executedActivityIdList.isEmpty()) { + return null; + } + + + //高亮线路id集合 + ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); + List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList); + + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId); + processEngineConfiguration = processEngine.getProcessEngineConfiguration(); + Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); + HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator(); + //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId()); + + InputStream imageStream = diagramGenerator.generateDiagram( + bpmnModel, "png", + executedActivityIdList, highLightedFlows, + processEngine.getProcessEngineConfiguration().getActivityFontName(), + processEngine.getProcessEngineConfiguration().getLabelFontName(), + "宋体", + null, 1.0, currentActivityIdList); + + return imageStream; + } +} diff --git a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java new file mode 100644 index 0000000..dda59c1 --- /dev/null +++ b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java @@ -0,0 +1,30 @@ +package org.activiti.rest.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhuxiaomeng + * @date 2019-03-10. + * @email 154040976@qq.com + */ +@Data +@ApiModel("流程顺序") +public class ActivitiProcess { + + @ApiModelProperty("流程活动名称") + String taskName; + + @ApiModelProperty("用户id") + String userId; + + @ApiModelProperty("用户名") + String userName; + + @ApiModelProperty("流程线id") + String sid; + + @ApiModelProperty("审批时间") + String time; +} diff --git a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html new file mode 100644 index 0000000..d270897 --- /dev/null +++ b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html @@ -0,0 +1,106 @@ + + + + + 流程图 + + + + + + + + + + + +
        +
        +
          +
        • 流程图
        • +
        • 流程审批
        • +
        +
        +
        +
        +
        + + +
        +
        +
        +
        +
          + +
        +
        +
        + +
        + + + + + diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index 84dfb28..55a0afe 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -10,6 +10,7 @@ 请假流程示例 <#include "/system/base/header.ftl"> + @@ -183,17 +184,7 @@ if (obj.event === 'start') { start(data.key); } else if (obj.event === 'getProcImage') { - layer.open({ - id: 'leave-image', - type: 2, - area: ['880px', '400px'], - fix: false, - maxmin: true, - shadeClose: false, - shade: 0.4, - title: '流程图', - content: '/leave/shinePics/' + data.processInstanceId - }); + activiti.img(data.processInstanceId); } else if (obj.event === 'leaveDetail') { layer.open({ id: 'leave-detail', diff --git a/len-activiti/src/main/resources/ftl/act/leave/shinePics.ftl b/len-activiti/src/main/resources/ftl/act/leave/shinePics.ftl deleted file mode 100644 index bde2af4..0000000 --- a/len-activiti/src/main/resources/ftl/act/leave/shinePics.ftl +++ /dev/null @@ -1,62 +0,0 @@ -<#--Created by IntelliJ IDEA. -User: zxm -Date: 2017/12/20 -Time: 10:00 -To change this template use File | Settings | File Templates.--> - - - - - - - 流程图 -<#include "/system/base/header.ftl"> - - - -
        -
        -
        -
        - - -
        -
        -
        -
        - - - - diff --git a/len-activiti/src/main/resources/ftl/actModelList.ftl b/len-activiti/src/main/resources/ftl/actModelList.ftl index 807bf2d..e293250 100644 --- a/len-activiti/src/main/resources/ftl/actModelList.ftl +++ b/len-activiti/src/main/resources/ftl/actModelList.ftl @@ -145,16 +145,16 @@ } }); }, add: function () { - var index = layer.open({ + var index = window.top.layer.open({ id: 'act-add', type: 2, - area: ['600px', '350px'], + area: [$(window).width()+'px',$(window).height()+'px'], fix: false, maxmin: true, shadeClose: false, shade: 0.4, title: '添加流程', - content: 'goActiviti' + content: '/act/goActiviti' }); layer.full(index); } @@ -165,20 +165,19 @@ if (obj.event === 'open') { open(data.id); } else if (obj.event === 'update') { - var index = layer.open({ + var index = window.top.layer.open({ id: 'act-update', type: 2, - area: ['600px', '350px'], + area: [$(window).width()+'px',$(window).height()+'px'], fix: false, maxmin: true, shadeClose: false, shade: 0.4, title: '编辑流程', - content: 'actUpdate/' + data.id + content: '/act/actUpdate/' + data.id }); - layer.full(index); } else if (obj.event === 'del') { - layer.confirm('确定删除[' + data.name + ']?', { + layer.confirm('确定删除[' + data.name + ']?', { btn: ['确定', '取消'] //按钮 }, function () { del(data.id); @@ -212,13 +211,14 @@ } function syncdata() { + var index= layer.load(2); $.ajax({ url: "syncdata", type: "post", dataType: "json", traditional: true, success: function (data) { + layer.close(index) layer.msg(data.msg, {icon: 6}); - //layui.table.reload('actModeltList'); } }); } diff --git a/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml b/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml index 8bcc43e..d6a1a8e 100644 --- a/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml +++ b/len-activiti/src/main/resources/mapper/UserLeaveMapper.xml @@ -32,5 +32,6 @@ + order by create_date desc \ No newline at end of file diff --git a/len-activiti/src/main/resources/plugin/activiti.js b/len-activiti/src/main/resources/plugin/activiti.js new file mode 100644 index 0000000..aa0038c --- /dev/null +++ b/len-activiti/src/main/resources/plugin/activiti.js @@ -0,0 +1,29 @@ +var activiti = { + + /** + * + * @param processInstanceId 流程实例ID + * @param w 宽 + * @param h 高 + */ + img: function (processInstanceId, w, h) { + if (typeof w==='undefined') { + w = $(window).width(); + } + if (typeof h==='undefined') { + h = $(window).height(); + } + window.parent.layer.open({ + id: Math.floor(Math.random() * 1000), + type: 2, + area: [w + 'px', h + 'px'], + fix: false, + maxmin: true, + shadeClose: false, + shade: 0.4, + title: '流程图', + content: '/act/shinePics/' + processInstanceId + }); + } + +}; \ No newline at end of file diff --git a/len-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js b/len-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js index 0ed69ae..8aa39d7 100644 --- a/len-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js +++ b/len-activiti/src/main/resources/static/editor-app/configuration/properties-assignment-controller.js @@ -1,7 +1,7 @@ /* * Activiti Modeler component part of the Activiti project * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. - * + * * 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 @@ -33,11 +33,11 @@ var KisBpmAssignmentCtrl = [ '$scope', '$modal','$http', function($scope, $modal }]; var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { - + // Put json representing assignment on scope if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.assignment !== undefined - && $scope.property.value.assignment !== null) + && $scope.property.value.assignment !== null) { $scope.assignment = $scope.property.value.assignment; } else { @@ -46,7 +46,7 @@ var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { if ($scope.assignment.candidateUsers == undefined || $scope.assignment.candidateUsers.length == 0) { - $scope.assignment.candidateUsers = [{value: ''}]; + $scope.assignment.candidateUsers = [{value: ''}]; } @@ -54,7 +54,7 @@ var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { { $scope.assignment.assignee = ''; } - + // Click handler for + button after enum value var userValueIndex = 1; $scope.addCandidateUserValue = function(index) { @@ -65,12 +65,12 @@ var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { $scope.removeCandidateUserValue = function(index) { $scope.assignment.candidateUsers.splice(index, 1); }; - + if ($scope.assignment.candidateGroups == undefined || $scope.assignment.candidateGroups.length == 0) { - $scope.assignment.candidateGroups = [{value: ''}]; + $scope.assignment.candidateGroups = [{value: ''}]; } - + var groupValueIndex = 1; $scope.addCandidateGroupValue = function(index) { $scope.assignment.candidateGroups.splice(index + 1, 0, {value: 'value ' + groupValueIndex++}); @@ -108,72 +108,72 @@ var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { $scope.property.value = {}; handleAssignmentInput($scope); $scope.property.value.assignment = $scope.assignment; - + $scope.updatePropertyInModel($scope.property); $scope.close(); }; // Close button handler $scope.close = function() { - handleAssignmentInput($scope); - $scope.property.mode = 'read'; - $scope.$hide(); + handleAssignmentInput($scope); + $scope.property.mode = 'read'; + $scope.$hide(); }; - + var handleAssignmentInput = function($scope) { - if ($scope.assignment.candidateUsers) - { - var emptyUsers = true; - var toRemoveIndexes = []; - for (var i = 0; i < $scope.assignment.candidateUsers.length; i++) - { - if ($scope.assignment.candidateUsers[i].value != '') - { - emptyUsers = false; - } - else - { - toRemoveIndexes[toRemoveIndexes.length] = i; - } - } - - for (var i = 0; i < toRemoveIndexes.length; i++) - { - $scope.assignment.candidateUsers.splice(toRemoveIndexes[i], 1); - } - - if (emptyUsers) - { - $scope.assignment.candidateUsers = undefined; - } - } - - if ($scope.assignment.candidateGroups) - { - var emptyGroups = true; - var toRemoveIndexes = []; - for (var i = 0; i < $scope.assignment.candidateGroups.length; i++) - { - if ($scope.assignment.candidateGroups[i].value != '') - { - emptyGroups = false; - } - else - { - toRemoveIndexes[toRemoveIndexes.length] = i; - } - } - - for (var i = 0; i < toRemoveIndexes.length; i++) - { - $scope.assignment.candidateGroups.splice(toRemoveIndexes[i], 1); - } - - if (emptyGroups) - { - $scope.assignment.candidateGroups = undefined; - } - } + if ($scope.assignment.candidateUsers) + { + var emptyUsers = true; + var toRemoveIndexes = []; + for (var i = 0; i < $scope.assignment.candidateUsers.length; i++) + { + if ($scope.assignment.candidateUsers[i].value != '') + { + emptyUsers = false; + } + else + { + toRemoveIndexes[toRemoveIndexes.length] = i; + } + } + + for (var i = 0; i < toRemoveIndexes.length; i++) + { + $scope.assignment.candidateUsers.splice(toRemoveIndexes[i], 1); + } + + if (emptyUsers) + { + $scope.assignment.candidateUsers = undefined; + } + } + + if ($scope.assignment.candidateGroups) + { + var emptyGroups = true; + var toRemoveIndexes = []; + for (var i = 0; i < $scope.assignment.candidateGroups.length; i++) + { + if ($scope.assignment.candidateGroups[i].value != '') + { + emptyGroups = false; + } + else + { + toRemoveIndexes[toRemoveIndexes.length] = i; + } + } + + for (var i = 0; i < toRemoveIndexes.length; i++) + { + $scope.assignment.candidateGroups.splice(toRemoveIndexes[i], 1); + } + + if (emptyGroups) + { + $scope.assignment.candidateGroups = undefined; + } + } }; //因新打开的界面上选定的数据要传输到当前modal中,所以使用此方式,这是angular.js中不同控制器之间传输数据的方式 @@ -181,11 +181,24 @@ var KisBpmAssignmentPopupCtrl = [ '$scope','$modal', function($scope, $modal) { var infos = data.split(","); var nameInfos =nameData.split(","); // $scope.assignment.candidateUsers= []; - for(var i=0;i - \ No newline at end of file diff --git a/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html b/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html index f66c317..b405a44 100644 --- a/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html +++ b/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html @@ -29,22 +29,22 @@ - 工号 + 用户名 姓名 - + - + - + - {{account.code}} diff --git a/len-activiti/src/main/resources/static/editor-app/css/style-common.css b/len-activiti/src/main/resources/static/editor-app/css/style-common.css index 9eb9ebd..9ef77eb 100644 --- a/len-activiti/src/main/resources/static/editor-app/css/style-common.css +++ b/len-activiti/src/main/resources/static/editor-app/css/style-common.css @@ -77,8 +77,8 @@ body { } .simple-list li >.actions a { - padding: 4px 4px 0 4px; - } + padding: 4px 4px 0 4px; +} .simple-list li >.actions a:hover { background-color: #ffffff; @@ -164,7 +164,8 @@ label { /** Buttons **/ button.btn, a.btn { - background-color: #36a7c4; + /*background-color: #36a7c4;*/ + background-color: #6dc469; color: #ffffff; border-color: #ffffff; font-size: 15px; @@ -266,7 +267,8 @@ button.btn.btn-danger { } .dropdown-menu > li > a:hover, .dropdown-menu > ul > li > a:hover { - background: #36a7c4; + /*background: #36a7c4;*/ + background: #6dc469; color: #ffffff; } @@ -298,7 +300,8 @@ a.dropdown-toggle { } .open a.dropdown-toggle, a.dropdown-toggle:hover { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; } .btn-group.open .dropdown-toggle { @@ -310,35 +313,35 @@ a.dropdown-toggle { /** Subtle dropdown (eg. sort) */ .dropdown-subtle { - margin-right: 5px; - color: #606b7d; + margin-right: 5px; + color: #606b7d; } .dropdown-subtle .btn { - background: transparent; - line-height: 36px; - color: #606b7d; - padding: 0; - font-size: 14px; - border: none; - box-shadow: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; + background: transparent; + line-height: 36px; + color: #606b7d; + padding: 0; + font-size: 14px; + border: none; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; } .dropdown-subtle .btn-group.open .dropdown-toggle { - box-shadow: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; } .dropdown-subtle .btn:hover, .dropdown-subtle .btn:focus { - background: transparent; - color: #333333; + background: transparent; + color: #333333; } .dropdown-subtle a { - cursor: pointer; + cursor: pointer; } /** Popovers */ @@ -354,7 +357,7 @@ a.dropdown-toggle { .popover.bottom-left, .popover.bottom-right { margin-top: 10px; } - .popover>.arrow, .popover>.arrow { +.popover>.arrow, .popover>.arrow { margin-left: -11px; border-top-width: 0; border-bottom-color: #999; @@ -526,13 +529,15 @@ a.dropdown-toggle { .navbar-nav > li.active > a { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; } /* Sub header */ .subheader { - background-color: #e8edf1; - min-height: 60px; + background-color: #ffffff; + /*background-color: #e8edf1;*/ + min-height: 50px; border-bottom: 1px solid #a4acb9; } @@ -551,7 +556,8 @@ a.dropdown-toggle { .subheader .version { font-weight: bold; - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; font-size: 110%; padding-left: 5px; line-height: 1; @@ -690,7 +696,7 @@ a.dropdown-toggle { } .icon-pencil:before { - content: "\270f"; + content: "\270f"; } .icon-caret-up:before { @@ -885,7 +891,7 @@ a.dropdown-toggle { .alert.ng-hide-remove { opacity: 1; display:block!important; - } +} .alert.ng-hide { @@ -937,7 +943,7 @@ a.dropdown-toggle { } .wrapper.full { - padding: 40px 0px 0px 0px; + /*padding: 40px 0px 0px 0px;*/ overflow: hidden; max-width: 100%; min-width: 100%; @@ -1198,7 +1204,7 @@ button.selection:active, button.selection:focus { } .list-wrapper { - overflow: auto; + overflow: auto; } @@ -1220,7 +1226,8 @@ button.selection:active, button.selection:focus { } .list-header .summary .filter-action:hover { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; } .main-list .list-subheader { @@ -1265,7 +1272,8 @@ button.selection:active, button.selection:focus { padding-right: 0; border-radius: 3px; background-color: #e8edf1; - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; background-color: transparent; font-weight: normal; @@ -1292,7 +1300,8 @@ button.selection:active, button.selection:focus { } .full-list li.active > div { - border-left-color: #36a7c4; + /*border-left-color: #36a7c4;*/ + border-left-color: #6dc469; } .full-list li .title { @@ -1361,7 +1370,7 @@ button.selection:active, button.selection:focus { color: #ffffff; } - .modal-header .label, .header .label { +.modal-header .label, .header .label { padding: 0 3px 0 15px; color: #1a1a1a; font-weight: normal; @@ -1378,7 +1387,8 @@ button.selection:active, button.selection:focus { } .header .detail a:hover { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; text-decoration: underline; } @@ -1410,7 +1420,8 @@ button.selection:active, button.selection:focus { .jumpers li.selected { color: white; - background-color: #36a7c4; + /*background-color: #36a7c4;*/ + background-color: #6dc469; } diff --git a/len-activiti/src/main/resources/static/editor-app/css/style-editor.css b/len-activiti/src/main/resources/static/editor-app/css/style-editor.css index bce6fa7..3e62e43 100644 --- a/len-activiti/src/main/resources/static/editor-app/css/style-editor.css +++ b/len-activiti/src/main/resources/static/editor-app/css/style-editor.css @@ -1,6 +1,6 @@ /** Colors: - + - Header: #333333 - Subheader: #e8edf1 - Subheader border: #a4acb9 @@ -17,12 +17,12 @@ } .subtle-select .glyphicon { - visibility: hidden; - padding-left: 5px; + visibility: hidden; + padding-left: 5px; } a.subtle-select:hover .glyphicon { - visibility: visible; + visibility: visible; } .full { @@ -31,30 +31,30 @@ a.subtle-select:hover .glyphicon { } .inline { - display: inline; + display: inline; } .greyish { - color: #afafaf; + color: #afafaf; } .roweditor-canvas { - margin-top: 50px; + margin-top: 50px; } .no-pad { margin: 0; max-width: 1300px; - min-width: 1100px; + min-width: 1100px; } .content.no-pad { - max-width: 100%; - min-width: 100%; + max-width: 100%; + min-width: 100%; } .inset .col-sm-3 { - margin-left: -15px; + margin-left: -15px; } .no-pad > div{ padding: 0; @@ -73,14 +73,14 @@ h1 { line-height: 40px; border: none; color: #ffffff; - font-family: 'Lato', sans-serif; + font-family: 'Lato', sans-serif; } .truncate, .truncate > span { - white-space: nowrap; - width: 100%; - overflow: hidden; - text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; } .subheader .details .counter { @@ -99,7 +99,7 @@ h1 { .btn .icon-and-label { padding-right: 5px; -} +} .dropdown-menu .title { margin: 5px 10px 0px 10px; @@ -121,7 +121,7 @@ h1 { .filter-wrapper { min-height: 400px; margin-top: 10px; - margin-left: -15px; + margin-left: -15px; } ul.filter-list { @@ -140,9 +140,11 @@ ul.filter-list li a { } ul.filter-list li.current a { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; padding-left: 5px; - border-left: 4px solid #36a7c4; + /*border-left: 4px solid #36a7c4;*/ + border-left: 4px solid #6dc469; } ul.filter-list li a:hover, ul.filter-list li a:focus { @@ -152,7 +154,8 @@ ul.filter-list li a:hover, ul.filter-list li a:focus { ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { background-color: transparent; - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; cursor: default; text-decoration: none; } @@ -173,7 +176,7 @@ ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { color: #606b7d; } .item-wrapper .message span { - font-size: 14px; + font-size: 14px; } .item-wrapper .item { @@ -183,12 +186,12 @@ ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { float: left; } -.item-wrapper .item .btn-default.disabled, +.item-wrapper .item .btn-default.disabled, .item-wrapper .item .btn-default[disabled], .item-wrapper .item .btn-default[disabled]:active, .item-wrapper .item .btn-default[disabled]:hover { border-color: #ffffff; - cursor: default; + cursor: default; } .item-wrapper .item .item-box { @@ -200,18 +203,18 @@ ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { background-repeat: no-repeat; background-position: center 20px; background-size: auto; - position: relative; + position: relative; } .item-box .details { - position: relative; + position: relative; background-color: #e8edf1; height: 160px; margin-top: 120px; padding: 5px; color: #373e48; font-size: 13px; - + transition: margin-top .5s ease; -moz-transition: margin-top .5s ease; -webkit-transition: margin-top .5s ease; @@ -274,7 +277,7 @@ ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { color: #1a1a1a; text-align: center; margin-bottom: 20px; -} +} .create-inline .glyphicon { margin-right: 10px; @@ -303,36 +306,36 @@ ul.filter-list li.current a:hover, ul.filter-list li.current a:focus { } .content-canvas-wrapper { - -moz-box-shadow: inset 0 3px 3px -4px #ababab; - -webkit-box-shadow: inset 0 3px 3px -4px #ababab; - box-shadow: inset 0 3px 3px -4px #ababab; - margin: 15px 7px 0 7px; - z-index: 0; + -moz-box-shadow: inset 0 3px 3px -4px #ababab; + -webkit-box-shadow: inset 0 3px 3px -4px #ababab; + box-shadow: inset 0 3px 3px -4px #ababab; + margin: 15px 7px 0 7px; + z-index: 0; } .content-canvas { - background-color: #f9f9f9; - margin: 0 3px 0 3px; + background-color: #f9f9f9; + margin: 0 3px 0 3px; - -moz-box-shadow: inset 0 3px 3px -4px #ababab; - -webkit-box-shadow: inset 0 3px 3px -4px #ababab; - box-shadow: inset 0 3px 3px -4px #ababab; + -moz-box-shadow: inset 0 3px 3px -4px #ababab; + -webkit-box-shadow: inset 0 3px 3px -4px #ababab; + box-shadow: inset 0 3px 3px -4px #ababab; - padding: 20px; + padding: 20px; } .content-canvas h3 { - margin-bottom: 5px; + margin-bottom: 5px; } .content-canvas .no-results{ - color: #999999; - font-size: 16px; - margin: 10px 0px; + color: #999999; + font-size: 16px; + margin: 10px 0px; } .content-canvas .item-wrapper { - margin: 5px 10px; + margin: 5px 10px; } /* History */ @@ -342,11 +345,11 @@ table.history { } .subheader table.history { - min-width: 250px; + min-width: 250px; } table.history td { - vertical-align: middle; + vertical-align: middle; } table.history tr td:last-child { @@ -365,16 +368,17 @@ table.history tr.current:hover { table.history a:hover { text-decoration: none; - + } table.history .version { font-size: 30px; display: inline-block; - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; padding: 5px 10px; vertical-align:middle; - color: #36a7c4; + /*color: #36a7c4;*/ } table.history .detail { @@ -398,11 +402,11 @@ table.history tr.current td { border-top: 1px solid #eeeeee; margin-top: 5px; max-height: 350px; - overflow: auto; + overflow: auto; } .comment { - margin: 10px 0px 20px 0px; + margin: 10px 0px 20px 0px; font-size: 12px; } @@ -412,20 +416,21 @@ table.history tr.current td { } .comment .author { - color: #36a7c4; + /*color: #36a7c4;*/ + color: #6dc469; font-size: 18px; } .comment p { - word-wrap: break-word; + word-wrap: break-word; } .modal.modal-wide .modal-dialog { - width: 1000px; + width: 1000px; } .modal-dialog.modal-wide { - width: 1000px; + width: 1000px; } .modal-body p { @@ -438,202 +443,202 @@ table.history tr.current td { } .form-group .inline-help { - font-size: 11px; - color: #666666; - margin-top: 5px; + font-size: 11px; + color: #666666; + margin-top: 5px; } .form-group .message { - color: #1a1a1a; - font-size: 14px; + color: #1a1a1a; + font-size: 14px; } .people-select > .selection { - width: 100%; - text-align: left; + width: 100%; + text-align: left; } .popup-wrapper .people-select { - max-height: 160px; + max-height: 160px; } .people-select .nothing-to-see { - padding: 5px 0; + padding: 5px 0; - color: #999999; + color: #999999; } .inline-people-select { - max-height: 120px; - overflow: auto; + max-height: 120px; + overflow: auto; } /** Center tabbed pane */ .center-pane { - overflow: auto; - padding-bottom: 20px; + overflow: auto; + padding-bottom: 20px; } .center-pane .content { - overflow: hidden; + overflow: hidden; } .center-pane .tab-actions { - padding: 8px; + padding: 8px; } .center-pane .tabs-wrapper > .pull-right { - margin-right: 5px; + margin-right: 5px; } .center-pane .content { - padding: 10px; + padding: 10px; } .center-pane.content { - padding: 0; + padding: 0; } .center-pane .content .tabs, .center-pane.content .tabs { - padding-left: 15px; + padding-left: 15px; } .center-pane .content .tabs > li a, .center-pane.content .tabs > li a { - padding: 8px 30px; + padding: 8px 30px; } .center-pane .header h1 { - font-size: 30px; - margin: 0; - padding:0; + font-size: 30px; + margin: 0; + padding:0; } .center-pane .header h2 { - font-size: 24px; - margin: 0 0 5px 0; - padding:0; + font-size: 24px; + margin: 0 0 5px 0; + padding:0; } .center-pane .header { - padding: 5px 10px 25px 10px; + padding: 5px 10px 25px 10px; } .center-pane .header.compact { - padding-bottom: 5px; + padding-bottom: 5px; } .center-pane .well { - -moz-border-radius: 0px; - -webkit-border-radius: px; - border-radius: 0px; - background-color: #f9f9f9; - padding: 12px 10px; - margin: 15px 0 0 0; - border: 1px solid #eeeeee; + -moz-border-radius: 0px; + -webkit-border-radius: px; + border-radius: 0px; + background-color: #f9f9f9; + padding: 12px 10px; + margin: 15px 0 0 0; + border: 1px solid #eeeeee; } /** General button styling */ .btn.btn-clean { - border: none; - background-color: transparent; - font-size: 24px; - padding: 2px 6px; - color: #444444; + border: none; + background-color: transparent; + font-size: 24px; + padding: 2px 6px; + color: #444444; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } .btn-clean:hover .icon-remove { - color: #a02828; + color: #a02828; } .btn-clean:focus, .btn-clean:hover { - color: #5f8dd3; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; + color: #5f8dd3; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } .btn-clean:active { - color: #2c5aa0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; + color: #2c5aa0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } /* Show list in popup */ ul.list { - list-style: none inside; - padding: 0px; - margin-bottom: 3px; + list-style: none inside; + padding: 0px; + margin-bottom: 3px; } ul.list>li { - line-height: 30px; - margin: 0; - padding: 4px; - cursor: pointer; + line-height: 30px; + margin: 0; + padding: 4px; + cursor: pointer; } .popup-wrapper ul.list>li { - border-top: 1px solid #eeeeee; + border-top: 1px solid #eeeeee; } .popup-wrapper ul.list>li:last-child { - border-bottom: 1px solid #eeeeee; + border-bottom: 1px solid #eeeeee; } ul.list>li:hover, ul.list>li.active { - background-color: #f2f2f2; + background-color: #f2f2f2; } ul.list >li .actions { - float:right; - margin: 0px 0px 0px 5px; - visibility: hidden; + float:right; + margin: 0px 0px 0px 5px; + visibility: hidden; } ul.list>li:hover .actions { - visibility: inherit; + visibility: inherit; } /** Animations **/ -.fadein.ng-enter, +.fadein.ng-enter, .fadein.ng-move { - -webkit-transition: 0.5s linear opacity; - transition: 0.5s linear all; + -webkit-transition: 0.5s linear opacity; + transition: 0.5s linear all; } .fadein.ng-enter { - opacity:0; + opacity:0; } .fadein.ng-enter.ng-enter-active { - opacity:1; + opacity:1; } .fadein.ng-move { - opacity:0.5; + opacity:0.5; } .fadein.ng-move.ng-move-active { - opacity:1; + opacity:1; } .popup-error { - color: red; - padding: 0 5px 8px 0; + color: red; + padding: 0 5px 8px 0; } /** Passwords */ .password-field { - width: 320px; + width: 320px; } /** LOADING */ .message .loading { line-height: 40px; - margin-left: 0px; + margin-left: 0px; } \ No newline at end of file diff --git a/len-activiti/src/main/resources/static/editor-app/editor.html b/len-activiti/src/main/resources/static/editor-app/editor.html index d8defb7..1ad4102 100644 --- a/len-activiti/src/main/resources/static/editor-app/editor.html +++ b/len-activiti/src/main/resources/static/editor-app/editor.html @@ -14,15 +14,6 @@
        -
        -
        - -
        -
        @@ -48,7 +39,7 @@ data-drag="true" jqyoui-draggable="{onStart:'startDragCallback', onDrag:'dragCallback'}" data-jqyoui-options="{revert: 'invalid', helper: 'clone', opacity : 0.5}"> - + {{item.name}} @@ -57,21 +48,21 @@
        -
        + jqyoui-droppable="{onDrop:'dropCallback',onOver: 'overCallback', onOut: 'outCallback'}">
        - -
        {{'ELEMENT.AUTHOR' | translate}}: {{selectedItem.auditData.author}}
        @@ -117,7 +108,7 @@ ng-click="propertyClicked($index)" ng-class="{'clear' : $index%2 == 0}"> {{ property.title }} : {{ property.title }} ({{'PROPERTY.REMOVED' | translate}}) : - +
        - - + + diff --git a/len-activiti/src/main/resources/static/editor-app/editor/oryx.debug.js b/len-activiti/src/main/resources/static/editor-app/editor/oryx.debug.js index 6ce4343..da2e3ed 100644 --- a/len-activiti/src/main/resources/static/editor-app/editor/oryx.debug.js +++ b/len-activiti/src/main/resources/static/editor-app/editor/oryx.debug.js @@ -10,7 +10,7 @@ ORYX.Utils = { * General helper method for parsing a param out of current location url * @example * // Current url in Browser => "http://oryx.org?param=value" - * ORYX.Utils.getParamFromUrl("param") // => "value" + * ORYX.Utils.getParamFromUrl("param") // => "value" * @param {Object} name */ getParamFromUrl: function(name){ @@ -25,17 +25,17 @@ ORYX.Utils = { return results[1]; } }, - + adjustLightness: function(){ - return arguments[0]; + return arguments[0]; }, - + adjustGradient: function(gradient, reference){ - + if (ORYX.CONFIG.DISABLE_GRADIENT && gradient){ - + var col = reference.getAttributeNS(null, "stop-color") || "#ffffff"; - + $A(gradient.getElementsByTagName("stop")).each(function(stop){ if (stop == reference){ return; } stop.setAttributeNS(null, "stop-color", col); @@ -152,7 +152,7 @@ var ERDF = { log: undefined, init: function(callback) { - + // init logging. //ERDF.log = Log4js.getLogger("oryx"); //ERDF.log.setLevel(Log4js.Level.ALL); @@ -175,12 +175,12 @@ var ERDF = { // do the work. return ERDF._checkProfile() && ERDF.parse(); }, - + parse: function() { - + //(ERDF.log.isDebugEnabled()) // ERDF.log.debug("Begin parsing document metadata."); - + // time measuring ERDF.__startTime = new Date(); @@ -189,16 +189,16 @@ var ERDF = { var result = ERDF._parseDocumentMetadata() && ERDF._parseFromTag(bodies[0], subject); - + // time measuring ERDF.__stopTime = new Date(); var duration = (ERDF.__stopTime - ERDF.__startTime)/1000.; //alert('ERDF parsing took ' + duration + ' s.'); - + return result; }, - + _parseDocumentMetadata: function() { // get links from head element. @@ -211,12 +211,12 @@ var ERDF = { var properties = link.getAttribute('rel'); var reversedProperties = link.getAttribute('rev'); var value = link.getAttribute('href'); - + ERDF._parseTriplesFrom( ERDF.RESOURCE, '', properties, ERDF.RESOURCE, value); - + ERDF._parseTriplesFrom( ERDF.RESOURCE, value, reversedProperties, @@ -227,7 +227,7 @@ var ERDF = { $A(metas).each(function(meta) { var property = meta.getAttribute('name'); var value = meta.getAttribute('content'); - + ERDF._parseTriplesFrom( ERDF.RESOURCE, '', property, @@ -236,12 +236,12 @@ var ERDF = { return true; }, - + _parseFromTag: function(node, subject, depth) { - + // avoid parsing non-xhtml content. if(!node || !node.namespaceURI || node.namespaceURI != XMLNS.XHTML) { return; } - + // housekeeping. if(!depth) depth=0; var id = node.getAttribute('id'); @@ -251,9 +251,9 @@ var ERDF = { // ERDF.log.trace(">".times(depth) + " Parsing " + node.nodeName + " ("+node.nodeType+") for data on " + // ((subject.type == ERDF.RESOURCE) ? ('<' + subject.value + '>') : '') + // ((subject.type == ERDF.LITERAL) ? '"' + subject.value + '"' : '')); - + /* triple finding! */ - + // in a-tags... if(node.nodeName.endsWith(':a') || node.nodeName == 'a') { var properties = node.getAttribute('rel'); @@ -269,7 +269,7 @@ var ERDF = { ERDF.RESOURCE, value, function(triple) { var label = title? title : content; - + // label triples ERDF._parseTriplesFrom( triple.object.type, triple.object.value, @@ -282,7 +282,7 @@ var ERDF = { subject.type, subject.value, reversedProperties, ERDF.RESOURCE, ''); - + // type triples ERDF._parseTypeTriplesFrom( subject.type, subject.value, @@ -300,7 +300,7 @@ var ERDF = { ERDF.RESOURCE, value, function(triple) { var label = alt; - + // label triples ERDF._parseTriplesFrom( triple.object.type, triple.object.value, @@ -309,13 +309,13 @@ var ERDF = { }); } - + // in every tag var properties = node.getAttribute('class'); var title = node.getAttribute('title'); var content = node.textContent; var label = title ? title : content; - + // regular triples ERDF._parseTriplesFrom( subject.type, subject.value, @@ -323,7 +323,7 @@ var ERDF = { ERDF.LITERAL, label); if(id) subject = {type: ERDF.RESOURCE, value: ERDF.HASH+id}; - + // type triples ERDF._parseTypeTriplesFrom( subject.type, subject.value, @@ -335,13 +335,13 @@ var ERDF = { if(_node.nodeType == _node.ELEMENT_NODE) ERDF._parseFromTag(_node, subject, depth+1); }); }, - + _parseTriplesFrom: function(subjectType, subject, properties, objectType, object, callback) { - + if(!properties) return; properties.toLowerCase().split(' ').each( function(property) { - + //if(ERDF.log.isTraceEnabled()) // ERDF.log.trace("Going for property " + property); @@ -350,7 +350,7 @@ var ERDF = { return property.startsWith(schema.prefix + delimiter); }); }); - + if(schema && object) { property = property.substring( schema.prefix.length+1, property.length); @@ -360,26 +360,26 @@ var ERDF = { (objectType == ERDF.RESOURCE) ? new ERDF.Resource(object) : new ERDF.Literal(object)); - + if(callback) callback(triple); } }); }, - + _parseTypeTriplesFrom: function(subjectType, subject, properties, callback) { - + if(!properties) return; properties.toLowerCase().split(' ').each( function(property) { - + //if(ERDF.log.isTraceEnabled()) // ERDF.log.trace("Going for property " + property); - + var schema = ERDF.schemas.find( function(schema) { return false || ERDF.DELIMITERS.find( function(delimiter) { return property.startsWith(ERDF.HYPHEN + schema.prefix + delimiter); }); }); - + if(schema && subject) { property = property.substring(schema.prefix.length+2, property.length); var triple = ERDF.registerTriple( @@ -392,7 +392,7 @@ var ERDF = { } }); }, - + /** * Checks for ERDF profile declaration in head of document. */ @@ -410,50 +410,50 @@ var ERDF = { //if(ERDF.log.isTraceEnabled()) // ERDF.log.trace("Found ERDF profile " + XMLNS.ERDF); return true; - + } else { - + // otherwise fail check. //if(ERDF.log.isFatalEnabled()) // ERDF.log.fatal("No ERDF profile found."); return false; } }, - + __stripHashes: function(s) { return (s && (typeof s.substring == 'function') && s.substring(0, 1)=='#') ? s.substring(1, s.length) : s; }, - + registerSchema: function(prefix, namespace) { - + // TODO check whether already registered, if so, complain. ERDF.schemas.push({ prefix: prefix, namespace: namespace }); - + //if(ERDF.log.isDebugEnabled()) // ERDF.log.debug("Prefix '"+prefix+"' for '"+namespace+"' registered."); }, - + registerTriple: function(subject, predicate, object) { - + // if prefix is schema, this is a schema definition. if(predicate.prefix.toLowerCase() == 'schema') this.registerSchema(predicate.name, object.value); - + var triple = new ERDF.Triple(subject, predicate, object); ERDF.callback(triple); - + //if(ERDF.log.isInfoEnabled()) // ERDF.log.info(triple) - + // return the registered triple. return triple; }, - + __enhanceObject: function() { - + /* Resource state querying methods */ this.isResource = function() { return this.type == ERDF.RESOURCE }; @@ -461,7 +461,7 @@ var ERDF = { return this.isResource() && this.value.startsWith('#') }; this.isCurrentDocument = function() { return this.isResource() && (this.value == '') }; - + /* Resource getter methods.*/ this.getId = function() { return this.isLocal() ? ERDF.__stripHashes(this.value) : false; }; @@ -470,9 +470,9 @@ var ERDF = { this.isLiteral = function() { return this.type == ERDF.LIITERAL }; }, - + serialize: function(literal) { - + if(!literal){ return ""; }else if(literal.constructor == String) { @@ -487,13 +487,13 @@ var ERDF = { ERDF.Triple = function(subject, predicate, object) { - + this.subject = subject; this.predicate = predicate; this.object = object; - + this.toString = function() { - + return "[ERDF.Triple] " + this.subject.toString() + ' ' + this.predicate.prefix + ':' + this.predicate.name + ' ' + @@ -502,19 +502,19 @@ ERDF.Triple = function(subject, predicate, object) { }; ERDF.Resource = function(uri) { - + this.type = ERDF.RESOURCE; this.value = uri; ERDF.__enhanceObject.apply(this); - + this.toString = function() { return '<' + this.value + '>'; } - + }; ERDF.Literal = function(literal) { - + this.type = ERDF.LITERAL; this.value = ERDF.serialize(literal); ERDF.__enhanceObject.apply(this); @@ -604,7 +604,7 @@ var PROCESSDATA_REF = 'processdata'; * @class DataManager */ var DataManager = { - + /** * The init method should be called once in the DataManagers lifetime. * It causes the DataManager to initialize itself, the erdf parser, do all @@ -616,12 +616,12 @@ var DataManager = { ERDF.init(DataManager._registerTriple); DataManager.__synclocal(); }, - + /** * This triple array is meant to be the whole knowledge of the DataManager. */ _triples: [], - + /** * This method is meant for callback from erdf parsing. It is not to be * used in another way than to add triples to the triple store. @@ -630,7 +630,7 @@ var DataManager = { _registerTriple: function(triple) { DataManager._triples.push(triple) }, - + /** * The __synclocal method is for internal usage only. * It performs synchronization with the local document, that is, the triple @@ -641,7 +641,7 @@ var DataManager = { DataManager._triples = []; ERDF.run(); }, - + /** * Makes the shape passed into this method synchronize itself with the DOM. * This method returns the shapes resource object for further manipulation. @@ -654,7 +654,7 @@ var DataManager = { // store all serialize values serialize.each( function(ser) { - + var resource = (ser.type == 'resource'); var _triple = new ERDF.Triple( new ERDF.Resource(shape.resourceId), @@ -665,38 +665,38 @@ var DataManager = { ); DataManager.setObject(_triple); }); - + return r; }, __storeShape: function(shape) { - + // first synchronize the shape, var resource = DataManager.__synchronizeShape(shape); - + // then save the synchronized dom. resource.save(); }, - + __forceExistance: function(shape) { - + if(!$(shape.resourceId)) { - + if(!$$('.' + PROCESSDATA_REF)[0]) DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, 'body').item(0), ['div', {'class': PROCESSDATA_REF, 'style':'display:none;'}]); - + // object is literal DataManager.graft(XMLNS.XHTML, $$('.' + PROCESSDATA_REF)[0], [ - + 'div', { 'id': shape.resourceId, //This should be done in a more dynamic way!!!!! 'class': (shape instanceof ORYX.Core.Canvas) ? "-oryx-canvas" : undefined } ]); - + } else { var resource = $(shape.resourceId) var children = $A(resource.childNodes) @@ -705,12 +705,12 @@ var DataManager = { }); }; }, - + __persistShape: function(shape) { // a shape serialization. var shapeData = shape.serialize(); - + // initialize a triple array and construct a shape resource // to be used in triple generation. var triplesArray = []; @@ -736,35 +736,35 @@ var DataManager = { )); }); }, - + __persistDOM: function(facade) { // getChildShapes gets all shapes (nodes AND edges), deep flag // makes it return a flattened child hierarchy. - + var canvas = facade.getCanvas(); var shapes = canvas.getChildShapes(true); var result = ''; - + // persist all shapes. shapes.each( function(shape) { DataManager.__forceExistance(shape); }); //DataManager.__synclocal(); - + DataManager.__renderCanvas(facade); result += DataManager.serialize( $(ERDF.__stripHashes(facade.getCanvas().resourceId)), true); - + shapes.each( function(shape) { - + DataManager.__persistShape(shape); result += DataManager.serialize( $(ERDF.__stripHashes(shape.resourceId)), true); }); - + //result += DataManager.__renderCanvas(facade); - + return result; }, @@ -773,11 +773,11 @@ var DataManager = { var canvas = facade.getCanvas(); var stencilSets = facade.getStencilSets(); var shapes = canvas.getChildShapes(true); - + DataManager.__forceExistance(canvas); - + DataManager.__persistShape(canvas); - + var shapeResource = new ERDF.Resource(canvas.resourceId); // remove all triples for this particular shape's resource @@ -802,13 +802,13 @@ var DataManager = { {prefix: "oryx", name: "stencilset"}, new ERDF.Resource(stencilset.source().replace(/&/g, "%26")) )); - + DataManager.addTriple( new ERDF.Triple( shapeResource, {prefix: "oryx", name: "ssnamespace"}, new ERDF.Resource(stencilset.namespace()) )); - + stencilset.extensions().keys().each(function(extension) { DataManager.addTriple( new ERDF.Triple( shapeResource, @@ -817,7 +817,7 @@ var DataManager = { )); }); }); - + shapes.each(function(shape) { DataManager.addTriple( new ERDF.Triple( shapeResource, @@ -829,23 +829,23 @@ var DataManager = { __counter: 0, __provideId: function() { - + while($(RESOURCE_ID_PREFIX+DataManager.__counter)) DataManager.__counter++; - + return RESOURCE_ID_PREFIX+DataManager.__counter; }, - + serializeDOM: function(facade) { - + return DataManager.__persistDOM(facade); }, - + syncGlobal: function(facade) { - + return DataManager.__syncglobal(facade); }, - + /** * This method is used to synchronize local DOM with remote resources. * Local changes are commited to the server, and remote changes are @@ -857,7 +857,7 @@ var DataManager = { // getChildShapes gets all shapes (nodes AND edges), deep flag // makes it return a flattened child hierarchy. - + var canvas = facade.getCanvas(); var shapes = canvas.getChildShapes(true); @@ -874,7 +874,7 @@ var DataManager = { // create new resources for them. if(USE_ARESS_WORKAROUNDS) { - + /* * This is a workaround due to a bug in aress. Resources are * ignoring changes to raziel:type property once they are @@ -882,28 +882,28 @@ var DataManager = { * being created using a randomly guessed id, this temporary id * is then used in references and the appropriate div is being * populated with properties. - * + * * AFTER THIS PHASE THE DATA IS INCONSISTENT AS REFERENCES POINT * TO IDS THAT ARE UNKNOWN TO THE BACK END. - * + * * After the resource is actually created in aress, it gets an id * that is persistent. All shapes are then being populated with the * correct id references and stored on the server. - * + * * AFTER THE SAVE PROCESS HAS RETURNED, THE DATA IS CONSISTENT * REGARDING THE ID REFERENCES AGAIN. */ - + var razielType = shape.properties['raziel-type']; - + var div = '
        ' + ''+razielType+'
        '; var r = ResourceManager.__createResource(div); shape.resourceId = r.id(); - + } else { - + var r = ResourceManager.__createResource(); shape.resourceId = r.id(); } @@ -911,12 +911,12 @@ var DataManager = { }); shapes.each( function(shape) { - + // store all shapes. DataManager.__storeShape(shape); }); }, - + /** * This method serializes a single div into a string that satisfies the * client/server communication protocol. It ingnores all elements that have @@ -930,7 +930,7 @@ var DataManager = { if (node.nodeType == node.ELEMENT_NODE) { // serialize an element node. - + var children = $A(node.childNodes); var attributes = $A(node.attributes); var clazz = new String(node.getAttribute('class')); @@ -942,28 +942,28 @@ var DataManager = { return ''; // start serialization. - + var result = '<' + node.nodeName; - + // preserve namespace? - if(!preserveNamespace) + if(!preserveNamespace) result += ' xmlns="' + (node.namespaceURI ? node.namespaceURI : XMLNS.XHTML) + '" xmlns:oryx="http://oryx-editor.org"'; - + // add all attributes. - + attributes.each(function(attribute) { result += ' ' + attribute.nodeName + '="' + attribute.nodeValue + '"';}); - + // close if no children. - + if(children.length == 0) result += '/>'; - + else { - + // serialize all children. - + result += '>'; children.each(function(_node) { result += DataManager.serialize(_node, true)}); @@ -971,13 +971,13 @@ var DataManager = { } return result; - + } else if (node.nodeType == node.TEXT_NODE) { - + // serialize a text node. return node.nodeValue; } - + //TODO serialize cdata areas also. //TODO work on namespace awareness. }, @@ -985,15 +985,15 @@ var DataManager = { addTriple: function(triple) { // assert the subject is a resource - + if(!triple.subject.type == ERDF.LITERAL) throw 'Cannot add the triple ' + triple.toString() + ' because the subject is not a resource.' - + // get the element which represents this triple's subject. var elementId = ERDF.__stripHashes(triple.subject.value); var element = $(elementId); - + // assert the subject is inside this document. if(!element) throw 'Cannot add the triple ' + triple.toString() + @@ -1006,7 +1006,7 @@ var DataManager = { 'span', {'class': (triple.predicate.prefix + "-" + triple.predicate.name)}, triple.object.value.escapeHTML() ]); - + else { // object is resource @@ -1014,12 +1014,12 @@ var DataManager = { 'a', {'rel': (triple.predicate.prefix + "-" + triple.predicate.name), 'href': triple.object.value} ]); - + } return true; }, - + removeTriples: function(triples) { // alert('Removing ' +triples.length+' triples.'); @@ -1028,19 +1028,19 @@ var DataManager = { var removed = triples.select( function(triple) { - + // TODO remove also from triple store. // ... that were actually removed. return DataManager.__removeTriple(triple); }); - + // sync and return removed triples. // DataManager.__synclocal(); return removed; }, - + removeTriple: function(triple) { - + // remember whether the triple was actually removed. var result = DataManager.__removeTriple(triple); @@ -1050,10 +1050,10 @@ var DataManager = { }, __removeTriple: function(triple) { - + // assert the subject is a resource if(!triple.subject.type == ERDF.LITERAL) - + throw 'Cannot remove the triple ' + triple.toString() + ' because the subject is not a resource.'; @@ -1063,39 +1063,39 @@ var DataManager = { // assert the subject is inside this document. if(!element) - + throw 'Cannot remove the triple ' + triple.toString() + ' because the subject is not in the document.'; - + if(triple.object.type == ERDF.LITERAL) { - + // continue searching actively for the triple. var result = DataManager.__removeTripleRecursively(triple, element); return result; } }, - __removeTripleRecursively: function(triple, continueFrom) { + __removeTripleRecursively: function(triple, continueFrom) { // return when this node is not an element node. if(continueFrom.nodeType != continueFrom.ELEMENT_NODE) return false; - + var classes = new String(continueFrom.getAttribute('class')); var children = $A(continueFrom.childNodes); - + if(classes.include(triple.predicate.prefix + '-' + triple.predicate.name)) { - + var content = continueFrom.textContent; if( (triple.object.type == ERDF.LITERAL) && (triple.object.value == content)) continueFrom.parentNode.removeChild(continueFrom); - + return true; - + } else { - + children.each(function(_node) { DataManager.__removeTripleRecursively(triple, _node)}); return false; @@ -1121,7 +1121,7 @@ var DataManager = { * @param {Object} doc the document in which grafting is performed. */ graft: function(namespace, parent, t, doc) { - + doc = (doc || (parent && parent.ownerDocument) || document); var e; if(t === undefined) { @@ -1142,12 +1142,12 @@ var DataManager = { e = doc.createElementNS(namespace, snared[1]); // but no class continue; } - + // Otherwise: e = doc.createElementNS(namespace, "span"); e.setAttribute(null, "class", "namelessFromLOL" ); } - + if( t[i] === undefined ) { echo("Can't graft an undefined value in a list!"); } else if( t[i].constructor == String || t[i].constructor == Array) { @@ -1163,9 +1163,9 @@ var DataManager = { throw "Object " + t[i] + " is inscrutable as an graft arglet."; } } - + if(parent) parent.appendChild(e); - + return Element.extend(e); // return the topmost created node }, @@ -1182,14 +1182,14 @@ var DataManager = { triple.predicate, undefined ); - + DataManager.removeTriples(triples); DataManager.addTriple(triple); return true; }, - + query: function(subject, predicate, object) { /* @@ -1197,10 +1197,10 @@ var DataManager = { * {value: subject, type: subjectType}, * {prefix: schema.prefix, name: property}, * {value: object, type: objectType}); - */ - + */ + return DataManager._triples.select(function(triple) { - + var select = ((subject) ? (triple.subject.type == subject.type) && (triple.subject.value == subject.value) : true); @@ -1223,18 +1223,18 @@ Kickstart.register(DataManager.init); function assert(expr, m) { if(!expr) throw m; }; function DMCommand(action, triple) { - + // store action and triple. this.action = action; this.triple = triple; - + this.toString = function() { return 'Command('+action+', '+triple+')'; }; } function DMCommandHandler(nextHandler) { - + /** * Private method to set the next handler in the Chain of Responsibility * (see http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern for @@ -1256,7 +1256,7 @@ function DMCommandHandler(nextHandler) { this.__invokeNext = function(command) { return this.__next ? this.__next.handle(command) : false; }; - + /** * Handles a command. The abstract method process() is called with the * command object that has been passed. If the process method catches the @@ -1268,7 +1268,7 @@ function DMCommandHandler(nextHandler) { this.handle = function(command) { return this.process(command) ? true : this.__invokeNext(command); } - + /** * Empty process() method returning false. If javascript knew abstract * class members, this would be one. @@ -1283,12 +1283,12 @@ function DMCommandHandler(nextHandler) { * @param {DMCommandHandler} next The handler that is next in the chain. */ function MetaTagHandler(next) { - + DMCommandHandler.apply(this, [next]); this.process = function(command) { - + with(command.triple) { - + /* assert prerequisites */ if( !( (subject instanceof ERDF.Resource) && @@ -1296,7 +1296,7 @@ function MetaTagHandler(next) { (object instanceof ERDF.Literal) )) return false; } - + }; }; @@ -1313,12 +1313,12 @@ if(chain.handle(command)) */ ResourceManager = { - + __corrupt: false, __latelyCreatedResource: undefined, __listeners: $H(), __token: 1, - + addListener: function(listener, mask) { if(!(listener instanceof Function)) @@ -1329,30 +1329,30 @@ ResourceManager = { // construct controller and token. var controller = {listener: listener, mask: mask}; var token = ResourceManager.__token++; - + // add new listener. ResourceManager.__listeners[token] = controller; - + // return the token generated. return token; }, - + removeListener: function(token) { - + // remove the listener with the token and return it. return ResourceManager.__listners.remove(token); }, - + __Event: function(action, resourceId) { this.action = action; this.resourceId = resourceId; }, - + __dispatchEvent: function(event) { - + // get all listeners. for each listener, ... ResourceManager.__listeners.values().each(function(controller) { - + // .. if listener subscribed to this type of event ... if(event.action & controller.mask) return controller.listener(event); @@ -1385,7 +1385,7 @@ ResourceManager = { }, __createResource: function(alternativeDiv) { - + var collectionUrls = DataManager.query( new ERDF.Resource(''), // TODO This will become raziel:collection in near future. @@ -1394,50 +1394,50 @@ ResourceManager = { ); // check for consistency. - + if( (collectionUrls.length == 1) && (collectionUrls[0].object.isResource())) { // get the collection url. - + var collectionUrl = collectionUrls[0].object.value; var resource = undefined; - + // if there is an old id, serialize the dummy div from there, // otherwise create a dummy div on the fly. - - var serialization = alternativeDiv? alternativeDiv : + + var serialization = alternativeDiv? alternativeDiv : '
        '; - + ResourceManager.__request( 'POST', collectionUrl, serialization, // on success function() { - + // get div and id that have been generated by the server. - + var response = (this.responseXML); var div = response.childNodes[0]; var id = div.getAttribute('id'); - + // store div in DOM if(!$$('.' + PROCESSDATA_REF)[0]) DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, 'body').item(0), ['div', {'class': PROCESSDATA_REF, 'style':'display:none;'}]); - + $$('.' + PROCESSDATA_REF)[0].appendChild(div.cloneNode(true)); // parse local erdf data once more. - + DataManager.__synclocal(); - + // get new resource object. resource = new ResourceManager.getResource(id); // set up an action informing of the creation. - + ResourceManager.__resourceActionSucceeded( this, RESOURCE_CREATED, undefined); }, @@ -1446,44 +1446,44 @@ ResourceManager = { this, RESOURCE_CREATED, undefined);}, false ); - + return resource; } - + // else throw 'Could not create resource! raziel:collection URL is missing!'; return false; }, - + __Resource: function(id, url) { - + this.__id = id; this.__url = url; - + /* * Process URL is no longer needed to refer to the shape element on the * canvas. AReSS uses the id's to gather information on fireing * behaviour now. */ - -// // find the process url. + +// // find the process url. // var processUrl = undefined; -// +// // var urls = DataManager.query( // new ERDF.Resource('#'+this.__id), // {prefix: 'raziel', name: 'process'}, // undefined // ); -// +// // if(urls.length == 0) { throw 'The resource with the id ' +id+ ' has no process url.'}; -// +// // urls.each( function(triple) { -// +// // // if there are more urls, use the last one. // processUrl = triple.object.value; // }); -// +// // this.__processUrl = processUrl; // // // convenience function for getting the process url. @@ -1501,7 +1501,7 @@ ResourceManager = { this.url = function() { return this.__url; } - + this.reload = function() { var _url = this.__url; var _id = this.__id; @@ -1514,7 +1514,7 @@ ResourceManager = { USE_ASYNCHRONOUS_REQUESTS ); }; - + this.save = function(synchronize) { var _url = this.__url; var _id = this.__id; @@ -1528,7 +1528,7 @@ ResourceManager = { USE_ASYNCHRONOUS_REQUESTS ); }; - + this.remove = function() { var _url = this.__url; var _id = this.__id; @@ -1552,29 +1552,29 @@ ResourceManager = { }; Object.extend(options, requestOptions || {}); - + var params = Hash.toQueryString(options.parameters); - if (params) + if (params) url += (url.include('?') ? '&' : '?') + params; - + return ResourceManager.__request( - options.method, - url, - options.data, - (options.onSuccess instanceof Function ? function() { options.onSuccess(this); } : undefined ), - (options.onFailure instanceof Function ? function() { options.onFailure(this); } : undefined ), + options.method, + url, + options.data, + (options.onSuccess instanceof Function ? function() { options.onSuccess(this); } : undefined ), + (options.onFailure instanceof Function ? function() { options.onFailure(this); } : undefined ), options.asynchronous && USE_ASYNCHRONOUS_REQUESTS, options.headers); }, - + __request: function(method, url, data, success, error, async, headers) { - + // get a request object var httpRequest = Try.these( /* do the Mozilla/Safari/Opera stuff */ function() { return new XMLHttpRequest(); }, - + /* do the IE stuff */ function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, function() { return new ActiveXObject("Microsoft.XMLHTTP") } @@ -1587,23 +1587,23 @@ ResourceManager = { this.__corrupt = true; return false; } - + if(success instanceof Function) httpRequest.onload = success; if(error instanceof Function) { httpRequest.onerror = error; } - + var h = $H(headers) h.keys().each(function(key) { - + httpRequest.setRequestHeader(key, h[key]); - }); - + }); + try { if(SHOW_DEBUG_ALERTS_WHEN_SAVING) - + alert(method + ' ' + url + '\n' + SHOW_EXTENDED_DEBUG_INFORMATION ? data : ''); @@ -1611,7 +1611,7 @@ ResourceManager = { // handles asynchronous requests without failure. httpRequest.open(method, url, !async?false:true); httpRequest.send(data); - + } catch(e) { return false; } @@ -1619,10 +1619,10 @@ ResourceManager = { }, __resourceActionSucceeded: function(transport, action, id) { - + var status = transport.status; var response = transport.responseText; - + if(SHOW_DEBUG_ALERTS_WHEN_SAVING) alert(status + ' ' + url + '\n' + @@ -1633,14 +1633,14 @@ ResourceManager = { throw 'The server responded with an error: ' + status + '\n' + (SHOW_EXTENDED_DEBUG_INFORMATION ? + data : 'If you need additional information here, including the data sent by the server, consider setting SHOW_EXTENDED_DEBUG_INFORMATION to true.'); switch(action) { - + case RESOURCE_REMOVED: // get div and id var response = (transport.responseXML); var div = response.childNodes[0]; var id = div.getAttribute('id'); - + // remove the resource from DOM var localDiv = document.getElementById(id); localDiv.parentNode.removeChild(localDiv); @@ -1650,7 +1650,7 @@ ResourceManager = { // nothing remains to be done. break; - + case RESOURCE_SAVED | RESOURCE_SYNCHRONIZED: DataManager.__synclocal(); @@ -1661,21 +1661,21 @@ ResourceManager = { break; case RESOURCE_RELOADED: - + // get div and id var response = (transport.responseXML); var div = response.childNodes[0]; var id = div.getAttribute('id'); - + // remove the local resource representation from DOM var localDiv = document.getElementById(id) localDiv.parentNode.removeChild(localDiv); - + // store div in DOM if(!$$(PROCESSDATA_REF)[0]) DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, 'body').item(0), ['div', {'class': PROCESSDATA_REF, 'style':'display:none;'}]); - + $$(PROCESSDATA_REF)[0].appendChild(div.cloneNode(true)); DataManager.__synclocal(); break; @@ -1684,7 +1684,7 @@ ResourceManager = { DataManager.__synclocal(); } - + // dispatch to all listeners ... ResourceManager.__dispatchEvent( @@ -1746,20 +1746,20 @@ Clazz.extend = function(def) { var classDef = function() { if (arguments[0] !== Clazz) { this.construct.apply(this, arguments); } }; - + var proto = new this(Clazz); var superClass = this.prototype; - + for (var n in def) { - var item = def[n]; + var item = def[n]; if (item instanceof Function) item.$ = superClass; proto[n] = item; } classDef.prototype = proto; - - //Give this new class the same static extend method - classDef.extend = this.extend; + + //Give this new class the same static extend method + classDef.extend = this.extend; return classDef; };/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -1785,11 +1785,11 @@ ORYX.CONFIG.LIBS_PATH = "libs"; /** * Regular Config - */ + */ ORYX.CONFIG.SERVER_HANDLER_ROOT = "service"; ORYX.CONFIG.SERVER_EDITOR_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor"; ORYX.CONFIG.SERVER_MODEL_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/model"; -ORYX.CONFIG.STENCILSET_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_stencilset?embedsvg=true&url=true&namespace="; +ORYX.CONFIG.STENCILSET_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_stencilset?embedsvg=true&url=true&namespace="; ORYX.CONFIG.STENCIL_SETS_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_stencilset"; ORYX.CONFIG.PLUGINS_CONFIG = "editor-app/plugins.xml"; @@ -1810,8 +1810,8 @@ ORYX.CONFIG.VARIABLEDEF_ELEMENT_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/ ORYX.CONFIG.VALIDATOR_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/validators"; ORYX.CONFIG.SS_EXTENSIONS_FOLDER = ORYX.CONFIG.ROOT_PATH + "stencilsets/extensions/"; -ORYX.CONFIG.SS_EXTENSIONS_CONFIG = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_ssextensions"; -ORYX.CONFIG.ORYX_NEW_URL = "/new"; +ORYX.CONFIG.SS_EXTENSIONS_CONFIG = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_ssextensions"; +ORYX.CONFIG.ORYX_NEW_URL = "/new"; ORYX.CONFIG.BPMN_LAYOUTER = ORYX.CONFIG.ROOT_PATH + "bpmnlayouter"; ORYX.CONFIG.EXPRESSION_METADATA_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/expression-metadata"; @@ -1850,7 +1850,7 @@ ORYX.CONFIG.SHOW_GRIDLINE = true; /* Editor-Mode */ ORYX.CONFIG.MODE_READONLY = "readonly"; ORYX.CONFIG.MODE_FULLSCREEN = "fullscreen"; -ORYX.CONFIG.WINDOW_HEIGHT = 800; +ORYX.CONFIG.WINDOW_HEIGHT = 800; ORYX.CONFIG.PREVENT_LOADINGMASK_AT_READY = false; /* Plugins */ @@ -1864,7 +1864,7 @@ ORYX.CONFIG.NAMESPACE_ORYX = "http://www.b3mn.org/oryx"; ORYX.CONFIG.NAMESPACE_SVG = "http://www.w3.org/2000/svg"; /* UI */ -ORYX.CONFIG.CANVAS_WIDTH = 1200; +ORYX.CONFIG.CANVAS_WIDTH = 1200; ORYX.CONFIG.CANVAS_HEIGHT = 1050; ORYX.CONFIG.CANVAS_RESIZE_INTERVAL = 100; ORYX.CONFIG.CANVAS_MIN_WIDTH = 800; @@ -1883,7 +1883,7 @@ ORYX.CONFIG.OFFSET_EDGE_LABEL_TOP = 8; ORYX.CONFIG.OFFSET_EDGE_LABEL_BOTTOM = 8; ORYX.CONFIG.OFFSET_EDGE_BOUNDS = 5; ORYX.CONFIG.COPY_MOVE_OFFSET = 30; - + ORYX.CONFIG.BORDER_OFFSET = 14; ORYX.CONFIG.MAX_NUM_SHAPES_NO_GROUP = 20; // Updated so the form editor shows all elements at once @@ -1930,7 +1930,7 @@ ORYX.CONFIG.TYPE_DATASOURCE = "datasource"; ORYX.CONFIG.TYPE_DATASOURCE_MINIMAL = "datasource-minimal"; ORYX.CONFIG.TYPE_VALIDATORS = "validators"; - + /* Vertical line distance of multiline labels */ ORYX.CONFIG.LABEL_LINE_DISTANCE = 2; ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT = 12; @@ -1960,7 +1960,7 @@ ORYX.CONFIG.EVENT_KEYUP = "keyup"; ORYX.CONFIG.EVENT_LOADED = "editorloaded"; ORYX.CONFIG.EVENT_SAVED = "editorSaved"; - + ORYX.CONFIG.EVENT_EXECUTE_COMMANDS = "executeCommands"; ORYX.CONFIG.EVENT_STENCIL_SET_LOADED = "stencilSetLoaded"; ORYX.CONFIG.EVENT_SELECTION_CHANGED = "selectionchanged"; @@ -2001,18 +2001,18 @@ ORYX.CONFIG.EVENT_GLOSSARY_SHOW = "glossary.show.info"; ORYX.CONFIG.EVENT_GLOSSARY_NEW = "glossary.show.new"; ORYX.CONFIG.EVENT_DOCKERDRAG = "dragTheDocker"; ORYX.CONFIG.EVENT_CANVAS_SCROLL = "canvas.scroll"; - + ORYX.CONFIG.EVENT_SHOW_PROPERTYWINDOW = "propertywindow.show"; ORYX.CONFIG.EVENT_ABOUT_TO_SAVE = "file.aboutToSave"; - + /* Selection Shapes Highlights */ ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE = 5; ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR = "#4444FF"; ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR2 = "#9999FF"; - + ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_CORNER = "corner"; ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE = "rectangle"; - + ORYX.CONFIG.SELECTION_VALID_COLOR = "#00FF00"; ORYX.CONFIG.SELECTION_INVALID_COLOR = "#FF0000"; @@ -2020,7 +2020,7 @@ ORYX.CONFIG.SELECTION_INVALID_COLOR = "#FF0000"; ORYX.CONFIG.DOCKER_DOCKED_COLOR = "#00FF00"; ORYX.CONFIG.DOCKER_UNDOCKED_COLOR = "#FF0000"; ORYX.CONFIG.DOCKER_SNAP_OFFSET = 10; - + /* Copy & Paste */ ORYX.CONFIG.EDIT_OFFSET_PASTE = 10; @@ -2044,7 +2044,7 @@ ORYX.CONFIG.KEY_Code_top = 38; ORYX.CONFIG.KEY_Code_bottom = 40; /* Supported Meta Keys */ - + ORYX.CONFIG.META_KEY_META_CTRL = "metactrl"; ORYX.CONFIG.META_KEY_ALT = "alt"; ORYX.CONFIG.META_KEY_SHIFT = "shift"; @@ -2066,7 +2066,7 @@ ORYX.CONFIG.FORM_ELEMENT_TYPE_ROOT = 'http://b3mn.org/stencilset/xforms#XFor ORYX.CONFIG.FORM_ELEMENT_TYPE_GROUP = 'http://b3mn.org/stencilset/xforms#Group'; ORYX.CONFIG.FORM_ELEMENT_TYPE_REPEATING_GROUP = 'http://b3mn.org/stencilset/xforms#RepeatingGroup'; ORYX.CONFIG.FORM_ELEMENT_TYPE_LABEL_FIELD = 'http://b3mn.org/stencilset/xforms#LabelField'; - + /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * License rights for this program may be obtained from Alfresco Software, Ltd. @@ -2078,7 +2078,7 @@ ORYX.CONFIG.FORM_ELEMENT_TYPE_LABEL_FIELD = 'http://b3mn.org/stencilset/xforms */ function printf() { - + var result = arguments[0]; for (var i=1; i= ORYX_LOGLEVEL_TRACE) ORYX.Log.__log('TRACE', arguments); }, debug: function() { if(ORYX_LOGLEVEL >= ORYX_LOGLEVEL_DEBUG) @@ -2141,18 +2141,18 @@ ORYX = Object.extend(ORYX, { ORYX.Log.__log('ERROR', arguments); }, fatal: function() { if(ORYX_LOGLEVEL >= ORYX_LOGLEVEL_FATAL) ORYX.Log.__log('FATAL', arguments); }, - + __log: function(prefix, messageParts) { - + messageParts[0] = (new Date()).getTime() + " " + prefix + " " + messageParts[0]; var message = printf.apply(null, messageParts); - + ORYX.Log.__appenders.each(function(appender) { appender.append(message); }); }, - + addAppender: function(appender) { ORYX.Log.__appenders.push(appender); } @@ -2167,9 +2167,9 @@ ORYX = Object.extend(ORYX, { * preliminary condition is not met has to fail with an error. */ load: function() { - + ORYX.Log.debug("Oryx begins loading procedure."); - + // check for prototype if( (typeof Prototype=='undefined') || (typeof Element == 'undefined') || @@ -2178,7 +2178,7 @@ ORYX = Object.extend(ORYX, { Prototype.Version.split(".")[1]) < 1.5) throw("Application requires the Prototype JavaScript framework >= 1.5.3"); - + ORYX.Log.debug("Prototype > 1.5 found."); // continue loading. @@ -2197,43 +2197,43 @@ ORYX = Object.extend(ORYX, { /* // if configuration not there already, if(!(ORYX.CONFIG)) { - + // if this is the first attempt... if(ORYX.configrationRetries == 0) { - + // get the path and filename. var configuration = ORYX.PATH + ORYX.CONFIGURATION; - + ORYX.Log.debug("Configuration not found, loading from '%0'.", configuration); - + // require configuration file. Kickstart.require(configuration); - + // else if attempts exceeded ... } else if(ORYX.configrationRetries >= ORYX_CONFIGURATION_WAIT_ATTEMPTS) { - + throw "Tried to get configuration" + ORYX_CONFIGURATION_WAIT_ATTEMPTS + " times from '" + configuration + "'. Giving up." - + } else if(ORYX.configrationRetries > 0){ - + // point out how many attempts are left... ORYX.Log.debug("Waiting once more (%0 attempts left)", (ORYX_CONFIGURATION_WAIT_ATTEMPTS - ORYX.configrationRetries)); } - + // any case: continue in a moment with increased retry count. ORYX.configrationRetries++; window.setTimeout(ORYX._load, ORYX_CONFIGURATION_DELAY); return; } - + ORYX.Log.info("Configuration loaded."); - + // load necessary scripts. ORYX.URLS.each(function(url) { ORYX.Log.debug("Requireing '%0'", url); @@ -2250,7 +2250,7 @@ ORYX = Object.extend(ORYX, { * initialized. */ loadPlugins: function() { - + // load plugins if enabled. if(ORYX.CONFIG.PLUGINS_ENABLED) ORYX._loadPlugins() @@ -2260,14 +2260,14 @@ ORYX = Object.extend(ORYX, { // init the editor instances. init(); }, - + _loadPlugins: function() { // load plugin configuration file. var source = ORYX.CONFIG.PLUGINS_CONFIG; ORYX.Log.debug("Loading plugin configuration from '%0'.", source); - + new Ajax.Request(source, { asynchronous: false, method: 'get', @@ -2279,12 +2279,12 @@ ORYX = Object.extend(ORYX, { * file has to be processed and the contents need to be * considered for further plugin requireation. */ - + ORYX.Log.info("Plugin configuration file loaded."); - + // get plugins.xml content var resultXml = result.responseXML; - + // TODO: Describe how properties are handled. // Get the globale Properties var globalProperties = []; @@ -2293,27 +2293,27 @@ ORYX = Object.extend(ORYX, { var props = $A(p.childNodes); props.each( function(prop) { - var property = new Hash(); - + var property = new Hash(); + // get all attributes from the node and set to global properties var attributes = $A(prop.attributes) - attributes.each(function(attr){property[attr.nodeName] = attr.nodeValue}); - if(attributes.length > 0) { globalProperties.push(property) }; + attributes.each(function(attr){property[attr.nodeName] = attr.nodeValue}); + if(attributes.length > 0) { globalProperties.push(property) }; }); }); - + // TODO Why are we using XML if we don't respect structure anyway? // for each plugin element in the configuration.. var plugin = resultXml.getElementsByTagName("plugin"); $A(plugin).each( function(node) { - + // get all element's attributes. // TODO: What about: var pluginData = $H(node.attributes) !? var pluginData = new Hash(); $A(node.attributes).each( function(attr){ - pluginData[attr.nodeName] = attr.nodeValue}); - + pluginData[attr.nodeName] = attr.nodeValue}); + // ensure there's a name attribute. if(!pluginData['name']) { ORYX.Log.error("A plugin is not providing a name. Ingnoring this plugin."); @@ -2325,40 +2325,40 @@ ORYX = Object.extend(ORYX, { ORYX.Log.error("Plugin with name '%0' doesn't provide a source attribute.", pluginData['name']); return; } - + // Get all private Properties var propertyNodes = node.getElementsByTagName("property"); var properties = []; $A(propertyNodes).each(function(prop) { - var property = new Hash(); - - // Get all Attributes from the Node + var property = new Hash(); + + // Get all Attributes from the Node var attributes = $A(prop.attributes) - attributes.each(function(attr){property[attr.nodeName] = attr.nodeValue}); - if(attributes.length > 0) { properties.push(property) }; - + attributes.each(function(attr){property[attr.nodeName] = attr.nodeValue}); + if(attributes.length > 0) { properties.push(property) }; + }); - + // Set all Global-Properties to the Properties properties = properties.concat(globalProperties); - + // Set Properties to Plugin-Data pluginData['properties'] = properties; - + // Get the RequieredNodes var requireNodes = node.getElementsByTagName("requires"); var requires; - $A(requireNodes).each(function(req) { + $A(requireNodes).each(function(req) { var namespace = $A(req.attributes).find(function(attr){ return attr.name == "namespace"}) if( namespace && namespace.nodeValue ){ if( !requires ){ requires = {namespaces:[]} } - + requires.namespaces.push(namespace.nodeValue) - } - }); - + } + }); + // Set Requires to the Plugin-Data, if there is one if( requires ){ pluginData['requires'] = requires; @@ -2368,37 +2368,37 @@ ORYX = Object.extend(ORYX, { // Get the RequieredNodes var notUsesInNodes = node.getElementsByTagName("notUsesIn"); var notUsesIn; - $A(notUsesInNodes).each(function(not) { + $A(notUsesInNodes).each(function(not) { var namespace = $A(not.attributes).find(function(attr){ return attr.name == "namespace"}) if( namespace && namespace.nodeValue ){ if( !notUsesIn ){ notUsesIn = {namespaces:[]} } - + notUsesIn.namespaces.push(namespace.nodeValue) - } - }); - + } + }); + // Set Requires to the Plugin-Data, if there is one if( notUsesIn ){ pluginData['notUsesIn'] = notUsesIn; - } - - + } + + var url = ORYX.PATH + ORYX.CONFIG.PLUGINS_FOLDER + pluginData['source']; - + ORYX.Log.debug("Requireing '%0'", url); - + // Add the Script-Tag to the Site //Kickstart.require(url); - + ORYX.Log.info("Plugin '%0' successfully loaded.", pluginData['name']); - + // Add the Plugin-Data to all available Plugins ORYX.availablePlugins.push(pluginData); - + }); - + }, onFailure:this._loadPluginsOnFails }); @@ -2432,31 +2432,31 @@ if(!ORYX.Core.SVG) {ORYX.Core.SVG = {};} /** * EditPathHandler - * + * * Edit SVG paths' coordinates according to specified from-to movement and - * horizontal and vertical scaling factors. + * horizontal and vertical scaling factors. * The resulting path's d attribute is stored in instance variable d. - * + * * @constructor */ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ - + construct: function() { arguments.callee.$.construct.apply(this, arguments); - + this.x = 0; this.y = 0; this.oldX = 0; this.oldY = 0; this.deltaWidth = 1; this.deltaHeight = 1; - + this.d = ""; }, - + /** * init - * + * * @param {float} x Target point's x-coordinate * @param {float} y Target point's y-coordinate * @param {float} oldX Reference point's x-coordinate @@ -2471,13 +2471,13 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ this.oldY = oldY; this.deltaWidth = deltaWidth; this.deltaHeight = deltaHeight; - + this.d = ""; }, /** * editPointsAbs - * + * * @param {Array} points Array of absolutePoints */ editPointsAbs: function(points) { @@ -2491,16 +2491,16 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ newPoints.push(x); newPoints.push(y); } - + return newPoints; } else { //TODO error } }, - + /** * editPointsRel - * + * * @param {Array} points Array of absolutePoints */ editPointsRel: function(points) { @@ -2514,7 +2514,7 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ newPoints.push(x); newPoints.push(y); } - + return newPoints; } else { //TODO error @@ -2523,7 +2523,7 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ /** * arcAbs - A - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -2535,16 +2535,16 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ arcAbs: function(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { var pointsAbs = this.editPointsAbs([x, y]); var pointsRel = this.editPointsRel([rx, ry]); - - this.d = this.d.concat(" A" + pointsRel[0] + " " + pointsRel[1] + - " " + xAxisRotation + " " + largeArcFlag + + + this.d = this.d.concat(" A" + pointsRel[0] + " " + pointsRel[1] + + " " + xAxisRotation + " " + largeArcFlag + " " + sweepFlag + " " + pointsAbs[0] + " " + - pointsAbs[1] + " "); + pointsAbs[1] + " "); }, /** * arcRel - a - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -2555,16 +2555,16 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ arcRel: function(rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y) { var pointsRel = this.editPointsRel([rx, ry, x, y]); - - this.d = this.d.concat(" a" + pointsRel[0] + " " + pointsRel[1] + - " " + xAxisRotation + " " + largeArcFlag + + + this.d = this.d.concat(" a" + pointsRel[0] + " " + pointsRel[1] + + " " + xAxisRotation + " " + largeArcFlag + " " + sweepFlag + " " + pointsRel[2] + " " + - pointsRel[3] + " "); + pointsRel[3] + " "); }, /** * curvetoCubicAbs - C - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -2574,15 +2574,15 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoCubicAbs: function(x1, y1, x2, y2, x, y) { var pointsAbs = this.editPointsAbs([x1, y1, x2, y2, x, y]); - - this.d = this.d.concat(" C" + pointsAbs[0] + " " + pointsAbs[1] + - " " + pointsAbs[2] + " " + pointsAbs[3] + - " " + pointsAbs[4] + " " + pointsAbs[5] + " "); + + this.d = this.d.concat(" C" + pointsAbs[0] + " " + pointsAbs[1] + + " " + pointsAbs[2] + " " + pointsAbs[3] + + " " + pointsAbs[4] + " " + pointsAbs[5] + " "); }, /** * curvetoCubicRel - c - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -2592,73 +2592,73 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoCubicRel: function(x1, y1, x2, y2, x, y) { var pointsRel = this.editPointsRel([x1, y1, x2, y2, x, y]); - - this.d = this.d.concat(" c" + pointsRel[0] + " " + pointsRel[1] + - " " + pointsRel[2] + " " + pointsRel[3] + - " " + pointsRel[4] + " " + pointsRel[5] + " "); + + this.d = this.d.concat(" c" + pointsRel[0] + " " + pointsRel[1] + + " " + pointsRel[2] + " " + pointsRel[3] + + " " + pointsRel[4] + " " + pointsRel[5] + " "); }, /** * linetoHorizontalAbs - H - * + * * @param {Number} x */ linetoHorizontalAbs: function(x) { var pointsAbs = this.editPointsAbs([x, 0]); - - this.d = this.d.concat(" H" + pointsAbs[0] + " "); + + this.d = this.d.concat(" H" + pointsAbs[0] + " "); }, /** * linetoHorizontalRel - h - * + * * @param {Number} x */ linetoHorizontalRel: function(x) { var pointsRel = this.editPointsRel([x, 0]); - - this.d = this.d.concat(" h" + pointsRel[0] + " "); + + this.d = this.d.concat(" h" + pointsRel[0] + " "); }, /** * linetoAbs - L - * + * * @param {Number} x * @param {Number} y */ linetoAbs: function(x, y) { var pointsAbs = this.editPointsAbs([x, y]); - + this.d = this.d.concat(" L" + pointsAbs[0] + " " + pointsAbs[1] + " "); }, /** * linetoRel - l - * + * * @param {Number} x * @param {Number} y */ linetoRel: function(x, y) { var pointsRel = this.editPointsRel([x, y]); - + this.d = this.d.concat(" l" + pointsRel[0] + " " + pointsRel[1] + " "); }, /** * movetoAbs - M - * + * * @param {Number} x * @param {Number} y */ movetoAbs: function(x, y) { var pointsAbs = this.editPointsAbs([x, y]); - + this.d = this.d.concat(" M" + pointsAbs[0] + " " + pointsAbs[1] + " "); }, /** * movetoRel - m - * + * * @param {Number} x * @param {Number} y */ @@ -2669,13 +2669,13 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ } else { pointsRel = this.editPointsRel([x, y]); } - + this.d = this.d.concat(" m" + pointsRel[0] + " " + pointsRel[1] + " "); }, /** * curvetoQuadraticAbs - Q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -2683,14 +2683,14 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoQuadraticAbs: function(x1, y1, x, y) { var pointsAbs = this.editPointsAbs([x1, y1, x, y]); - + this.d = this.d.concat(" Q" + pointsAbs[0] + " " + pointsAbs[1] + " " + pointsAbs[2] + " " + pointsAbs[3] + " "); }, /** * curvetoQuadraticRel - q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -2698,14 +2698,14 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoQuadraticRel: function(x1, y1, x, y) { var pointsRel = this.editPointsRel([x1, y1, x, y]); - + this.d = this.d.concat(" q" + pointsRel[0] + " " + pointsRel[1] + " " + pointsRel[2] + " " + pointsRel[3] + " "); }, /** * curvetoCubicSmoothAbs - S - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -2713,14 +2713,14 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoCubicSmoothAbs: function(x2, y2, x, y) { var pointsAbs = this.editPointsAbs([x2, y2, x, y]); - + this.d = this.d.concat(" S" + pointsAbs[0] + " " + pointsAbs[1] + " " + pointsAbs[2] + " " + pointsAbs[3] + " "); }, /** * curvetoCubicSmoothRel - s - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -2728,54 +2728,54 @@ ORYX.Core.SVG.EditPathHandler = Clazz.extend({ */ curvetoCubicSmoothRel: function(x2, y2, x, y) { var pointsRel = this.editPointsRel([x2, y2, x, y]); - + this.d = this.d.concat(" s" + pointsRel[0] + " " + pointsRel[1] + " " + pointsRel[2] + " " + pointsRel[3] + " "); }, /** * curvetoQuadraticSmoothAbs - T - * + * * @param {Number} x * @param {Number} y */ curvetoQuadraticSmoothAbs: function(x, y) { var pointsAbs = this.editPointsAbs([x, y]); - + this.d = this.d.concat(" T" + pointsAbs[0] + " " + pointsAbs[1] + " "); }, /** * curvetoQuadraticSmoothRel - t - * + * * @param {Number} x * @param {Number} y */ curvetoQuadraticSmoothRel: function(x, y) { var pointsRel = this.editPointsRel([x, y]); - + this.d = this.d.concat(" t" + pointsRel[0] + " " + pointsRel[1] + " "); }, /** * linetoVerticalAbs - V - * + * * @param {Number} y */ linetoVerticalAbs: function(y) { var pointsAbs = this.editPointsAbs([0, y]); - + this.d = this.d.concat(" V" + pointsAbs[1] + " "); }, /** * linetoVerticalRel - v - * + * * @param {Number} y */ linetoVerticalRel: function(y) { var pointsRel = this.editPointsRel([0, y]); - + this.d = this.d.concat(" v" + pointsRel[1] + " "); }, @@ -2806,30 +2806,30 @@ if(!ORYX.Core.SVG) {ORYX.Core.SVG = {};} /** * MinMaxPathHandler - * + * * Determine the minimum and maximum of a SVG path's absolute coordinates. * For relative coordinates the absolute value is computed for consideration. * The values are stored in attributes minX, minY, maxX, and maxY. - * + * * @constructor */ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ - + construct: function() { arguments.callee.$.construct.apply(this, arguments); - + this.minX = undefined; this.minY = undefined; this.maxX = undefined; this.maxY = undefined; - + this._lastAbsX = undefined; this._lastAbsY = undefined; }, /** * Store minimal and maximal coordinates of passed points to attributes minX, maxX, minY, maxY - * + * * @param {Array} points Array of absolutePoints */ calculateMinMax: function(points) { @@ -2839,12 +2839,12 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ x = parseFloat(points[i]); i++; y = parseFloat(points[i]); - + this.minX = (this.minX !== undefined) ? Math.min(this.minX, x) : x; this.maxX = (this.maxX !== undefined) ? Math.max(this.maxX, x) : x; this.minY = (this.minY !== undefined) ? Math.min(this.minY, y) : y; this.maxY = (this.maxY !== undefined) ? Math.max(this.maxY, y) : y; - + this._lastAbsX = x; this._lastAbsY = y; } @@ -2855,7 +2855,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * arcAbs - A - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -2870,7 +2870,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * arcRel - a - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -2885,7 +2885,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoCubicAbs - C - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -2899,7 +2899,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoCubicRel - c - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -2915,7 +2915,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoHorizontalAbs - H - * + * * @param {Number} x */ linetoHorizontalAbs: function(x) { @@ -2924,7 +2924,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoHorizontalRel - h - * + * * @param {Number} x */ linetoHorizontalRel: function(x) { @@ -2933,7 +2933,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoAbs - L - * + * * @param {Number} x * @param {Number} y */ @@ -2943,7 +2943,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoRel - l - * + * * @param {Number} x * @param {Number} y */ @@ -2953,7 +2953,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * movetoAbs - M - * + * * @param {Number} x * @param {Number} y */ @@ -2963,7 +2963,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * movetoRel - m - * + * * @param {Number} x * @param {Number} y */ @@ -2977,7 +2977,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoQuadraticAbs - Q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -2989,7 +2989,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoQuadraticRel - q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -3001,7 +3001,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoCubicSmoothAbs - S - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -3013,7 +3013,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoCubicSmoothRel - s - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -3025,7 +3025,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoQuadraticSmoothAbs - T - * + * * @param {Number} x * @param {Number} y */ @@ -3035,7 +3035,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * curvetoQuadraticSmoothRel - t - * + * * @param {Number} x * @param {Number} y */ @@ -3045,7 +3045,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoVerticalAbs - V - * + * * @param {Number} y */ linetoVerticalAbs: function(y) { @@ -3054,7 +3054,7 @@ ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({ /** * linetoVerticalRel - v - * + * * @param {Number} y */ linetoVerticalRel: function(y) { @@ -3088,27 +3088,27 @@ if(!ORYX.Core.SVG) {ORYX.Core.SVG = {};} /** * PathHandler - * - * Determine absolute points of a SVG path. The coordinates are stored + * + * Determine absolute points of a SVG path. The coordinates are stored * sequentially in the attribute points (x-coordinates at even indices, * y-coordinates at odd indices). - * + * * @constructor */ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ - + construct: function() { arguments.callee.$.construct.apply(this, arguments); - + this.points = []; - + this._lastAbsX = undefined; this._lastAbsY = undefined; }, /** * addPoints - * + * * @param {Array} points Array of absolutePoints */ addPoints: function(points) { @@ -3118,11 +3118,11 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ x = parseFloat(points[i]); i++; y = parseFloat(points[i]); - + this.points.push(x); this.points.push(y); //this.points.push({x:x, y:y}); - + this._lastAbsX = x; this._lastAbsY = y; } @@ -3133,7 +3133,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * arcAbs - A - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -3148,7 +3148,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * arcRel - a - * + * * @param {Number} rx * @param {Number} ry * @param {Number} xAxisRotation @@ -3163,7 +3163,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoCubicAbs - C - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -3177,7 +3177,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoCubicRel - c - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x2 @@ -3191,7 +3191,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoHorizontalAbs - H - * + * * @param {Number} x */ linetoHorizontalAbs: function(x) { @@ -3200,7 +3200,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoHorizontalRel - h - * + * * @param {Number} x */ linetoHorizontalRel: function(x) { @@ -3209,7 +3209,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoAbs - L - * + * * @param {Number} x * @param {Number} y */ @@ -3219,7 +3219,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoRel - l - * + * * @param {Number} x * @param {Number} y */ @@ -3229,7 +3229,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * movetoAbs - M - * + * * @param {Number} x * @param {Number} y */ @@ -3239,7 +3239,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * movetoRel - m - * + * * @param {Number} x * @param {Number} y */ @@ -3253,7 +3253,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoQuadraticAbs - Q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -3265,7 +3265,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoQuadraticRel - q - * + * * @param {Number} x1 * @param {Number} y1 * @param {Number} x @@ -3277,7 +3277,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoCubicSmoothAbs - S - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -3289,7 +3289,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoCubicSmoothRel - s - * + * * @param {Number} x2 * @param {Number} y2 * @param {Number} x @@ -3301,7 +3301,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoQuadraticSmoothAbs - T - * + * * @param {Number} x * @param {Number} y */ @@ -3311,7 +3311,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * curvetoQuadraticSmoothRel - t - * + * * @param {Number} x * @param {Number} y */ @@ -3321,7 +3321,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoVerticalAbs - V - * + * * @param {Number} y */ linetoVerticalAbs: function(y) { @@ -3330,7 +3330,7 @@ ORYX.Core.SVG.PointsPathHandler = Clazz.extend({ /** * linetoVerticalRel - v - * + * * @param {Number} y */ linetoVerticalRel: function(y) { @@ -3415,7 +3415,7 @@ ORYX.Core.SVG.SVGMarker = Clazz.extend({ } this.id = this.element.getAttributeNS(null, "id"); - + //init svg marker attributes var refXValue = this.element.getAttributeNS(null, "refX"); if(refXValue) { @@ -3535,7 +3535,7 @@ ORYX.Core.SVG.SVGMarker = Clazz.extend({ this.oldMarkerWidth = this.markerWidth; this.oldMarkerHeight = this.markerHeight; }, - + toString: function() { return (this.element) ? "SVGMarker " + this.element.id : "SVGMarker " + this.element;} });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -3598,7 +3598,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ this.anchorRight = false; this.anchorTop = false; this.anchorBottom = false; - + //attributes of path elements of edge objects this.allowDockers = true; this.resizeMarkerMid = false; @@ -3617,7 +3617,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ /**initialize position and size*/ if(ORYX.Editor.checkClassType(this.element, SVGRectElement) || ORYX.Editor.checkClassType(this.element, SVGImageElement)) { this.type = "Rect"; - + var xAttr = this.element.getAttributeNS(null, "x"); if(xAttr) { this.oldX = parseFloat(xAttr); @@ -3645,7 +3645,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else if(ORYX.Editor.checkClassType(this.element, SVGCircleElement)) { this.type = "Circle"; - + var cx = undefined; var cy = undefined; //var r = undefined; @@ -3676,7 +3676,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else if(ORYX.Editor.checkClassType(this.element, SVGEllipseElement)) { this.type = "Ellipse"; - + var cx = undefined; var cy = undefined; //var rx = undefined; @@ -3712,7 +3712,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else if(ORYX.Editor.checkClassType(this.element, SVGLineElement)) { this.type = "Line"; - + var x1 = undefined; var y1 = undefined; var x2 = undefined; @@ -3748,7 +3748,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else if(ORYX.Editor.checkClassType(this.element, SVGPolylineElement) || ORYX.Editor.checkClassType(this.element, SVGPolygonElement)) { this.type = "Polyline"; - + var pointsArray = []; if (this.element.points&&this.element.points.numberOfItems){ for(var i=0, size=this.element.points.numberOfItems; i 1) { var minX = parseFloat(pointsArray[0]); @@ -3791,11 +3791,11 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else if(ORYX.Editor.checkClassType(this.element, SVGPathElement)) { this.type = "Path"; - + this.editPathParser = new PathParser(); this.editPathHandler = new ORYX.Core.SVG.EditPathHandler(); this.editPathParser.setHandler(this.editPathHandler); - + var parser = new PathParser(); var handler = new ORYX.Core.SVG.MinMaxPathHandler(); parser.setHandler(handler); @@ -3837,7 +3837,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ if(anchorAttr) { anchorAttr = anchorAttr.replace("/,/g", " "); var anchors = anchorAttr.split(" ").without(""); - + for(var i = 0; i < anchors.length; i++) { switch(anchors[i].toLowerCase()) { case "left": @@ -3855,28 +3855,28 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } } } - + //allowDockers and resizeMarkerMid if(ORYX.Editor.checkClassType(this.element, SVGPathElement)) { - var allowDockersAttr = this.element.getAttributeNS(NAMESPACE_ORYX, "allowDockers"); + var allowDockersAttr = this.element.getAttributeNS(NAMESPACE_ORYX, "allowDockers"); if(allowDockersAttr) { if(allowDockersAttr.toLowerCase() === "no") { - this.allowDockers = false; + this.allowDockers = false; } else { this.allowDockers = true; } } - - var resizeMarkerMidAttr = this.element.getAttributeNS(NAMESPACE_ORYX, "resizeMarker-mid"); + + var resizeMarkerMidAttr = this.element.getAttributeNS(NAMESPACE_ORYX, "resizeMarker-mid"); if(resizeMarkerMidAttr) { if(resizeMarkerMidAttr.toLowerCase() === "yes") { - this.resizeMarkerMid = true; + this.resizeMarkerMid = true; } else { this.resizeMarkerMid = false; } } - } - + } + this.x = this.oldX; this.y = this.oldY; this.width = this.oldWidth; @@ -3887,7 +3887,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ * Writes the changed values into the SVG element. */ update: function() { - + if(this.x !== this.oldX || this.y !== this.oldY || this.width !== this.oldWidth || this.height !== this.oldHeight) { switch(this.type) { case "Rect": @@ -3904,7 +3904,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ // } else { this.radiusX = ((this.width < this.height) ? this.width : this.height)/2.0; //} - + this.element.setAttributeNS(null, "cx", this.x + this.width/2.0); this.element.setAttributeNS(null, "cy", this.y + this.height/2.0); this.element.setAttributeNS(null, "r", this.radiusX); @@ -3912,7 +3912,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ case "Ellipse": this.radiusX = this.width/2; this.radiusY = this.height/2; - + this.element.setAttributeNS(null, "cx", this.x + this.radiusX); this.element.setAttributeNS(null, "cy", this.y + this.radiusY); this.element.setAttributeNS(null, "rx", this.radiusX); @@ -3921,13 +3921,13 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ case "Line": if(this.x !== this.oldX) this.element.setAttributeNS(null, "x1", this.x); - + if(this.y !== this.oldY) this.element.setAttributeNS(null, "y1", this.y); - + if(this.x !== this.oldX || this.width !== this.oldWidth) this.element.setAttributeNS(null, "x2", this.x + this.width); - + if(this.y !== this.oldY || this.height !== this.oldHeight) this.element.setAttributeNS(null, "y2", this.y + this.height); break; @@ -3935,13 +3935,13 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ var points = this.element.getAttributeNS(null, "points"); if(points) { points = points.replace(/,/g, " ").split(" ").without(""); - + if(points && points.length && points.length > 1) { - + //TODO what if oldWidth == 0? var widthDelta = (this.oldWidth === 0) ? 0 : this.width / this.oldWidth; var heightDelta = (this.oldHeight === 0) ? 0 : this.height / this.oldHeight; - + var updatedPoints = ""; for(var i = 0; i < points.length; i++) { var x = (parseFloat(points[i])-this.oldX)*widthDelta + this.x; @@ -3962,11 +3962,11 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ //TODO what if oldWidth == 0? var widthDelta = (this.oldWidth === 0) ? 0 : this.width / this.oldWidth; var heightDelta = (this.oldHeight === 0) ? 0 : this.height / this.oldHeight; - + //use path parser to edit each point of the path this.editPathHandler.init(this.x, this.y, this.oldX, this.oldY, widthDelta, heightDelta); this.editPathParser.parsePath(this.element); - + //change d attribute of path this.element.setAttributeNS(null, "d", this.editPathHandler.d); break; @@ -3977,12 +3977,12 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ this.oldWidth = this.width; this.oldHeight = this.height; } - + // Remove cached variables delete this.visible; delete this.handler; }, - + isPointIncluded: function(pointX, pointY) { // Check if there are the right arguments and if the node is visible @@ -4006,28 +4006,28 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ return ORYX.Core.Math.isPointInEllipse(pointX, pointY, this.x + this.width/2.0, this.y + this.height/2.0, this.radiusX, this.radiusX); break; case "Ellipse": - return ORYX.Core.Math.isPointInEllipse(pointX, pointY, this.x + this.radiusX, this.y + this.radiusY, this.radiusX, this.radiusY); + return ORYX.Core.Math.isPointInEllipse(pointX, pointY, this.x + this.radiusX, this.y + this.radiusY, this.radiusX, this.radiusY); break; case "Line": return ORYX.Core.Math.isPointInLine(pointX, pointY, this.x, this.y, this.x + this.width, this.y + this.height); break; case "Polyline": var points = this.element.getAttributeNS(null, "points"); - + if(points) { points = points.replace(/,/g , " ").split(" ").without(""); - + points = points.collect(function(n) { return parseFloat(n); }); - + return ORYX.Core.Math.isPointInPolygone(pointX, pointY, points); } else { return false; } break; case "Path": - + // Cache Path handler if (!this.handler) { var parser = new PathParser(); @@ -4035,7 +4035,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ parser.setHandler(this.handler); parser.parsePath(this.element); } - + return ORYX.Core.Math.isPointInPolygone(pointX, pointY, this.handler.points); break; @@ -4050,20 +4050,20 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ * @return boolean */ isVisible: function(elem) { - + if (this.visible !== undefined){ return this.visible; } - + if (!elem) { elem = this.element; } var hasOwnerSVG = false; - try { + try { hasOwnerSVG = !!elem.ownerSVGElement; } catch(e){} - + // Is SVG context if ( hasOwnerSVG ) { // IF G-Element @@ -4084,7 +4084,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ var attr = elem.getAttributeNS(null, "display"); if(!attr) this.visible = this.isVisible(elem.parentNode); - else if (attr == "none") + else if (attr == "none") this.visible = false; else this.visible = true; @@ -4092,7 +4092,7 @@ ORYX.Core.SVG.SVGShape = Clazz.extend({ } else { this.visible = true; } - + return this.visible; }, @@ -4116,10 +4116,10 @@ if(!ORYX.Core.SVG) {ORYX.Core.SVG = {};} /** * @classDescription Class for adding text to a shape. - * + * */ ORYX.Core.SVG.Label = Clazz.extend({ - + _characterSets:[ "%W", "@", @@ -4140,52 +4140,52 @@ ORYX.Core.SVG.Label = Clazz.extend({ * Constructor * @param options {Object} : * textElement - * + * */ construct: function(options) { arguments.callee.$.construct.apply(this, arguments); - + if(!options.textElement) { - throw "Label: No parameter textElement." + throw "Label: No parameter textElement." } else if (!ORYX.Editor.checkClassType( options.textElement, SVGTextElement ) ) { - throw "Label: Parameter textElement is not an SVGTextElement." + throw "Label: Parameter textElement is not an SVGTextElement." } - + this.invisibleRenderPoint = -5000; - + this.node = options.textElement; - - + + this.node.setAttributeNS(null, 'stroke-width', '0pt'); this.node.setAttributeNS(null, 'letter-spacing', '-0.01px'); - + this.shapeId = options.shapeId; - + this.id; - + this.fitToElemId; - + this.edgePosition; - + this.x; this.y; this.oldX; this.oldY; - + this.isVisible = true; - + this._text; this._verticalAlign; this._horizontalAlign; this._rotate; this._rotationPoint; - + //this.anchors = []; this.anchorLeft; this.anchorRight; this.anchorTop; this.anchorBottom; - + this._isChanged = true; //if the text element already has an id, don't change it. @@ -4193,21 +4193,21 @@ ORYX.Core.SVG.Label = Clazz.extend({ if(_id) { this.id = _id; } - - //initialization - + + //initialization + //set referenced element the text is fit to this.fitToElemId = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'fittoelem'); if(this.fitToElemId) this.fitToElemId = this.shapeId + this.fitToElemId; - - //set alignment + + //set alignment var alignValues = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'align'); if(alignValues) { alignValues = alignValues.replace(/,/g, " "); alignValues = alignValues.split(" "); alignValues = alignValues.without(""); - + alignValues.each((function(alignValue) { switch (alignValue) { case 'top': @@ -4223,27 +4223,27 @@ ORYX.Core.SVG.Label = Clazz.extend({ } }).bind(this)); } - + //set edge position (only in case the label belongs to an edge) this.edgePosition = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'edgePosition'); if(this.edgePosition) { this.originEdgePosition = this.edgePosition = this.edgePosition.toLowerCase(); } - - + + //get offset top this.offsetTop = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'offsetTop') || ORYX.CONFIG.OFFSET_EDGE_LABEL_TOP; if(this.offsetTop) { this.offsetTop = parseInt(this.offsetTop); } - + //get offset top this.offsetBottom = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'offsetBottom') || ORYX.CONFIG.OFFSET_EDGE_LABEL_BOTTOM; if(this.offsetBottom) { this.offsetBottom = parseInt(this.offsetBottom); } - - + + //set rotation var rotateValue = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'rotate'); if(rotateValue) { @@ -4255,13 +4255,13 @@ ORYX.Core.SVG.Label = Clazz.extend({ } else { this._rotate = 0; } - + //anchors var anchorAttr = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors"); if(anchorAttr) { anchorAttr = anchorAttr.replace("/,/g", " "); var anchors = anchorAttr.split(" ").without(""); - + for(var i = 0; i < anchors.length; i++) { switch(anchors[i].toLowerCase()) { case "left": @@ -4279,7 +4279,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ } } } - + //if no alignment defined, set default alignment if(!this._verticalAlign) { this._verticalAlign = 'bottom'; } if(!this._horizontalAlign) { this._horizontalAlign = 'left'; } @@ -4290,22 +4290,22 @@ ORYX.Core.SVG.Label = Clazz.extend({ } else { //TODO error } - + var yValue = this.node.getAttributeNS(null, 'y'); if(yValue) { this.oldY = this.y = parseFloat(yValue); } else { //TODO error } - + //set initial text this.text(this.node.textContent); }, - + /** * Reset the anchor position to the original value * which was specified in the stencil set - * + * */ resetAnchorPosition: function(){ this.anchorLeft = this.originAnchorLeft || false; @@ -4313,18 +4313,18 @@ ORYX.Core.SVG.Label = Clazz.extend({ this.anchorTop = this.originAnchorTop || false; this.anchorBottom = this.originAnchorBottom || false; }, - + isOriginAnchorLeft: function(){ return this.originAnchorLeft || false; }, isOriginAnchorRight: function(){ return this.originAnchorRight || false; }, isOriginAnchorTop: function(){ return this.originAnchorTop || false; }, isOriginAnchorBottom: function(){ return this.originAnchorBottom || false; }, - - + + isAnchorLeft: function(){ return this.anchorLeft || false; }, isAnchorRight: function(){ return this.anchorRight || false; }, isAnchorTop: function(){ return this.anchorTop || false; }, isAnchorBottom: function(){ return this.anchorBottom || false; }, - + /** * Returns the x coordinate * @return {number} @@ -4342,15 +4342,15 @@ ORYX.Core.SVG.Label = Clazz.extend({ return this.x; } }, - + setX: function(x){ if (this.position) this.position.x = x; - else + else this.setOriginX(x); }, - - + + /** * Returns the y coordinate * @return {number} @@ -4362,23 +4362,23 @@ ORYX.Core.SVG.Label = Clazz.extend({ return this.y; } }, - + setY: function(y){ if (this.position) this.position.y = y; - else + else this.setOriginY(y); }, - + setOriginX: function(x){ this.x = x; }, - + setOriginY: function(y){ this.y = y; }, - + /** * Returns the width of the label * @return {number} @@ -4405,7 +4405,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ return 0; } }, - + getOriginUpperLeft: function(){ var x = this.x, y = this.y; switch (this._horizontalAlign){ @@ -4426,7 +4426,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ } return {x:x, y:y}; }, - + /** * Returns the height of the label * @return {number} @@ -4438,9 +4438,9 @@ ORYX.Core.SVG.Label = Clazz.extend({ return 0; } }, - + /** - * Returns the relative center position of the label + * Returns the relative center position of the label * to its parent shape. * @return {Object} */ @@ -4450,7 +4450,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ up.y += this.getHeight()/2; return up; }, - + /** * Sets the position of a label relative to the parent. * @param {Object} position @@ -4461,23 +4461,23 @@ ORYX.Core.SVG.Label = Clazz.extend({ } else { this.position = position; } - + if (this.position){ delete this._referencePoint; delete this.edgePosition; } - + this._isChanged = true; this.update(); }, - + /** * Return the position */ getPosition: function(){ return this.position; }, - + setReferencePoint: function(ref){ if (ref) { this._referencePoint = ref; @@ -4488,15 +4488,15 @@ ORYX.Core.SVG.Label = Clazz.extend({ delete this.position; } }, - + getReferencePoint: function(){ return this._referencePoint || undefined; }, - + changed: function() { this._isChanged = true; }, - + /** * Register a callback which will be called if the label * was rendered. @@ -4510,7 +4510,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ this.changeCallbacks.push(fn); } }, - + /** * Unregister the callback for changes. * @param {Object} fn @@ -4520,40 +4520,40 @@ ORYX.Core.SVG.Label = Clazz.extend({ this.changeCallbacks = this.changeCallbacks.without(fn); } }, - + /** * Returns TRUE if the labe is currently in * the update mechanism. * @return {Boolean} */ isUpdating: function(){ - return !!this._isUpdating; + return !!this._isUpdating; }, - - + + getOriginEdgePosition: function(){ - return this.originEdgePosition; + return this.originEdgePosition; }, - + /** * Returns the edgeposition. - * - * @return {String} "starttop", "startmiddle", "startbottom", + * + * @return {String} "starttop", "startmiddle", "startbottom", * "midtop", "midbottom", "endtop", "endbottom" or null */ getEdgePosition: function(){ - return this.edgePosition || null; + return this.edgePosition || null; }, - + /** * Set the edge position, must be one of the valid * edge positions (see getEdgePosition). * Removes the reference point and the absolute position as well. - * + * * @param {Object} position */ setEdgePosition: function(position){ - if (["starttop", "startmiddle", "startbottom", + if (["starttop", "startmiddle", "startbottom", "midtop", "midbottom", "endtop", "endbottom"].include(position)){ this.edgePosition = position; delete this.position; @@ -4562,53 +4562,53 @@ ORYX.Core.SVG.Label = Clazz.extend({ delete this.edgePosition; } }, - + /** * Update the SVG text element. */ update: function(force) { - + var x = this.x, y = this.y; if (this.position){ x = this.position.x; y = this.position.y; } x = Math.floor(x); y = Math.floor(y); - + if(this._isChanged || x !== this.oldX || y !== this.oldY || force === true) { if (this.isVisible) { this._isChanged = false; this._isUpdating = true; - + this.node.setAttributeNS(null, 'x', x); this.node.setAttributeNS(null, 'y', y); this.node.removeAttributeNS(null, "fill-opacity"); - + //this.node.setAttributeNS(null, 'font-size', this._fontSize); //this.node.setAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, 'align', this._horizontalAlign + " " + this._verticalAlign); - + this.oldX = x; this.oldY = y; - + //set rotation if (!this.position && !this.getReferencePoint()) { if (this._rotate !== undefined) { - if (this._rotationPoint) + if (this._rotationPoint) this.node.setAttributeNS(null, 'transform', 'rotate(' + this._rotate + ' ' + Math.floor(this._rotationPoint.x) + ' ' + Math.floor(this._rotationPoint.y) + ')'); - else + else this.node.setAttributeNS(null, 'transform', 'rotate(' + this._rotate + ' ' + Math.floor(x) + ' ' + Math.floor(y) + ')'); } } else { this.node.removeAttributeNS(null, 'transform'); } - + var textLines = this._text.split("\n"); - while (textLines.last() == "") + while (textLines.last() == "") textLines.pop(); - - + + if (this.node.ownerDocument) { - // Only reset the tspans if the text + // Only reset the tspans if the text // has changed or has to be wrapped if (this.fitToElemId || this._textHasChanged){ this.node.textContent = ""; // Remove content @@ -4619,7 +4619,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ tspan.setAttributeNS(null, 'x', this.invisibleRenderPoint); tspan.setAttributeNS(null, 'y', this.invisibleRenderPoint); } - + /* * Chrome's getBBox() method fails, if a text node contains an empty tspan element. * So, we add a whitespace to such a tspan element. @@ -4627,19 +4627,19 @@ ORYX.Core.SVG.Label = Clazz.extend({ if(tspan.textContent === "") { tspan.textContent = " "; } - + //append tspan to text node this.node.appendChild(tspan); }).bind(this)); delete this._textHasChanged; delete this.indices; } - + //Work around for Mozilla bug 293581 if (this.isVisible && this.fitToElemId) { this.node.setAttributeNS(null, 'visibility', 'hidden'); } - + if (this.fitToElemId) { window.setTimeout(this._checkFittingToReferencedElem.bind(this), 0); //this._checkFittingToReferencedElem(); @@ -4654,41 +4654,41 @@ ORYX.Core.SVG.Label = Clazz.extend({ } } }, - + _checkFittingToReferencedElem: function() { try { var tspans = $A(this.node.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'tspan')); - + //only do this in firefox 3. all other browsers do not support word wrapping!!!!! //if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent) && new Number(RegExp.$1)>=3) { var newtspans = []; - + var refNode = this.node.ownerDocument.getElementById(this.fitToElemId); - + if (refNode) { var refbb = refNode.getBBox(); - + var fontSize = this.getFontSize(); - + for (var j = 0; j < tspans.length; j++) { var tspan = tspans[j]; - + var textLength = this._getRenderedTextLength(tspan, undefined, undefined, fontSize); - - var refBoxLength = (this._rotate != 0 - && this._rotate % 180 != 0 - && this._rotate % 90 == 0 ? + + var refBoxLength = (this._rotate != 0 + && this._rotate % 180 != 0 + && this._rotate % 90 == 0 ? refbb.height : refbb.width); - + if (textLength > refBoxLength) { - + var startIndex = 0; var lastSeperatorIndex = 0; - + var numOfChars = this.getTrimmedTextLength(tspan.textContent); for (var i = 0; i < numOfChars; i++) { var sslength = this._getRenderedTextLength(tspan, startIndex, i-startIndex, fontSize); - + if (sslength > refBoxLength - 2) { var newtspan = this.node.ownerDocument.createElementNS(ORYX.CONFIG.NAMESPACE_SVG, 'tspan'); if (lastSeperatorIndex <= startIndex) { @@ -4699,14 +4699,14 @@ ORYX.Core.SVG.Label = Clazz.extend({ else { newtspan.textContent = tspan.textContent.slice(startIndex, ++lastSeperatorIndex).trim(); } - + newtspan.setAttributeNS(null, 'x', this.invisibleRenderPoint); newtspan.setAttributeNS(null, 'y', this.invisibleRenderPoint); - + //insert tspan to text node //this.node.insertBefore(newtspan, tspan); newtspans.push(newtspan); - + startIndex = lastSeperatorIndex; } else { @@ -4721,16 +4721,16 @@ ORYX.Core.SVG.Label = Clazz.extend({ } } } - + tspan.textContent = tspan.textContent.slice(startIndex).trim(); } - + newtspans.push(tspan); } - - while (this.node.hasChildNodes()) + + while (this.node.hasChildNodes()) this.node.removeChild(this.node.childNodes[0]); - + while (newtspans.length > 0) { this.node.appendChild(newtspans.shift()); } @@ -4742,37 +4742,37 @@ ORYX.Core.SVG.Label = Clazz.extend({ window.setTimeout(this._positionText.bind(this), 0); //this._positionText(); }, - + /** * This is a work around method for Mozilla bug 293581. * Before the method getComputedTextLength works, the text has to be rendered. */ _positionText: function() { try { - + var tspans = this.node.childNodes; - - var fontSize = this.getFontSize(this.node); - + + var fontSize = this.getFontSize(this.node); + var invalidTSpans = []; - + var x = this.x, y = this.y; if (this.position){ x = this.position.x; y = this.position.y; } x = Math.floor(x); y = Math.floor(y); - - var i = 0, indic = []; // Cache indices if the _positionText is called again, before update is called + + var i = 0, indic = []; // Cache indices if the _positionText is called again, before update is called var is =(this.indices || $R(0,tspans.length-1).toArray()); var length = is.length; is.each((function(index){ if ("undefined" == typeof index){ return; } - + var tspan = tspans[i++]; - + if(tspan.textContent.trim() === "") { invalidTSpans.push(tspan); } else { @@ -4792,21 +4792,21 @@ ORYX.Core.SVG.Label = Clazz.extend({ break; } tspan.setAttributeNS(null, 'dy', Math.floor(dy)); - + tspan.setAttributeNS(null, 'x', x); tspan.setAttributeNS(null, 'y', y); indic.push(index); } - + }).bind(this)); - + indic.length = tspans.length; this.indices = this.indices || indic; - + invalidTSpans.each(function(tspan) { this.node.removeChild(tspan) }.bind(this)); - + //set horizontal alignment switch (this._horizontalAlign) { case 'left': @@ -4819,28 +4819,28 @@ ORYX.Core.SVG.Label = Clazz.extend({ this.node.setAttributeNS(null, 'text-anchor', 'end'); break; } - + } catch(e) { //console.log(e); this._isChanged = true; } - - + + if(this.isVisible) { this.node.removeAttributeNS(null, 'visibility'); - } - - + } + + // Finished delete this._isUpdating; - + // Raise change event (this.changeCallbacks||[]).each(function(fn){ fn.apply(fn); }) - + }, - + /** * Returns the text length of the text content of an SVG tspan element. * For all browsers but Firefox 3 the values are estimated. @@ -4867,7 +4867,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ } }*/ }, - + /** * Estimates the text width for a string. * Used for word wrapping in all browser but FF3. @@ -4878,10 +4878,10 @@ ORYX.Core.SVG.Label = Clazz.extend({ for(var i = 0; i < text.length; i++) { sum += this._estimateCharacterWidth(text.charAt(i)); } - + return sum*(fontSize/14.0); }, - + /** * Estimates the width of a single character for font size 14. * Used for word wrapping in all browser but FF3. @@ -4892,27 +4892,27 @@ ORYX.Core.SVG.Label = Clazz.extend({ if(this._characterSets[i].indexOf(character) >= 0) { return this._characterSetValues[i]; } - } + } return 9; }, - + getReferencedElementWidth: function() { var refNode = this.node.ownerDocument.getElementById(this.fitToElemId); - + if(refNode) { var refbb = refNode.getBBox(); - + if(refbb) { - return (this._rotate != 0 - && this._rotate % 180 != 0 - && this._rotate % 90 == 0 ? + return (this._rotate != 0 + && this._rotate % 180 != 0 + && this._rotate % 90 == 0 ? refbb.height : refbb.width); } } - + return undefined; }, - + /** * If no parameter is provided, this method returns the current text. * @param text {String} Optional. Replaces the old text with this one. @@ -4922,7 +4922,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ case 0: return this._text break; - + case 1: var oldText = this._text; if(arguments[0]) { @@ -4939,17 +4939,17 @@ ORYX.Core.SVG.Label = Clazz.extend({ this._textHasChanged = true; } break; - - default: + + default: //TODO error break; } }, - + getOriginVerticalAlign: function(){ return this._originVerticalAlign; }, - + verticalAlign: function() { switch(arguments.length) { case 0: @@ -4963,17 +4963,17 @@ ORYX.Core.SVG.Label = Clazz.extend({ } } break; - + default: //TODO error break; } }, - + getOriginHorizontalAlign: function(){ return this._originHorizontalAlign; }, - + horizontalAlign: function() { switch(arguments.length) { case 0: @@ -4984,16 +4984,16 @@ ORYX.Core.SVG.Label = Clazz.extend({ this._horizontalAlign = arguments[0]; if(this._horizontalAlign !== oldValue) { this._isChanged = true; - } + } } break; - + default: //TODO error break; } }, - + rotate: function() { switch(arguments.length) { case 0: @@ -5013,17 +5013,17 @@ ORYX.Core.SVG.Label = Clazz.extend({ this._rotationPoint = arguments[1]; this._isChanged = true; } - + } }, - + hide: function() { if(this.isVisible) { this.isVisible = false; this._isChanged = true; } }, - + show: function() { if(!this.isVisible) { this.isVisible = true; @@ -5034,7 +5034,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ this._textHasChanged = true; } }, - + /** * iterates parent nodes till it finds a SVG font-size * attribute. @@ -5043,7 +5043,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ getInheritedFontSize: function(node) { if(!node || !node.getAttributeNS) return; - + var attr = node.getAttributeNS(null, "font-size"); if(attr) { return parseFloat(attr); @@ -5051,14 +5051,14 @@ ORYX.Core.SVG.Label = Clazz.extend({ return this.getInheritedFontSize(node.parentNode); } }, - + getFontSize: function(node) { var tspans = this.node.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'tspan'); - + //trying to get an inherited font-size attribute //NO CSS CONSIDERED! - var fontSize = this.getInheritedFontSize(this.node); - + var fontSize = this.getInheritedFontSize(this.node); + if (!fontSize) { //because this only works in firefox 3, all other browser use the default line height if (tspans[0] && /Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 3) { @@ -5067,19 +5067,19 @@ ORYX.Core.SVG.Label = Clazz.extend({ else { fontSize = ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT; } - + //handling of unsupported method in webkit if (fontSize <= 0) { fontSize = ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT; } } - + if(fontSize) this.node.setAttribute("oryx:fontSize", fontSize); - + return fontSize; }, - + /** * Get trimmed text length for use with * getExtentOfChar and getSubStringLength. @@ -5087,7 +5087,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ */ getTrimmedTextLength: function(text) { text = text.strip().gsub(' ', ' '); - + var oldLength; do { oldLength = text.length; @@ -5096,36 +5096,36 @@ ORYX.Core.SVG.Label = Clazz.extend({ return text.length; }, - + /** * Returns the offset from - * edge to the label which is + * edge to the label which is * positioned under the edge * @return {int} */ getOffsetBottom: function(){ return this.offsetBottom; }, - - + + /** * Returns the offset from - * edge to the label which is + * edge to the label which is * positioned over the edge * @return {int} */ getOffsetTop: function(){ return this.offsetTop; }, - + /** - * + * * @param {Object} obj */ deserialize: function(obj, shape){ - if (obj && "undefined" != typeof obj.x && "undefined" != typeof obj.y){ + if (obj && "undefined" != typeof obj.x && "undefined" != typeof obj.y){ this.setPosition({x:obj.x, y:obj.y}); - + if ("undefined" != typeof obj.distance){ var from = shape.dockers[obj.from]; var to = shape.dockers[obj.to]; @@ -5146,25 +5146,25 @@ ORYX.Core.SVG.Label = Clazz.extend({ }) } } - + if (obj.left) this.anchorLeft = true; if (obj.right) this.anchorRight = true; if (obj.top) this.anchorTop = true; if (obj.bottom) this.anchorBottom = true; if (obj.valign) this.verticalAlign(obj.valign); if (obj.align) this.horizontalAlign(obj.align); - + } else if (obj && "undefined" != typeof obj.edge){ this.setEdgePosition(obj.edge); } }, /** - * + * * @return {Object} */ serialize: function(){ - + // On edge position if (this.getEdgePosition()){ if (this.getOriginEdgePosition() !== this.getEdgePosition()){ @@ -5173,7 +5173,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ return null; } } - + // On self defined position if (this.position){ var pos = {x: this.position.x, y: this.position.y}; @@ -5189,17 +5189,17 @@ ORYX.Core.SVG.Label = Clazz.extend({ if (this.isAnchorBottom() && this.isAnchorBottom() !== this.isOriginAnchorBottom()){ pos.bottom = true; } - + if (this.getOriginVerticalAlign() !== this.verticalAlign()){ pos.valign = this.verticalAlign(); } if (this.getOriginHorizontalAlign() !== this.horizontalAlign()){ pos.align = this.horizontalAlign(); } - + return pos; } - + // On reference point which is interesting for edges if (this.getReferencePoint()){ var ref = this.getReferencePoint(); @@ -5216,7 +5216,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ } return null; }, - + toString: function() { return "Label " + this.id } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -5234,7 +5234,7 @@ ORYX.Core.SVG.Label = Clazz.extend({ if(!ORYX) {var ORYX = {};} if(!ORYX.Core) {ORYX.Core = {};} if(!ORYX.Core.Math) {ORYX.Core.Math = {};} - + /** * Calculate the middle point between two given points * @param {x:double, y:double} point1 @@ -5247,12 +5247,12 @@ ORYX.Core.Math.midPoint = function(point1, point2) { y: (point1.y + point2.y) / 2.0 } } - + /** * Returns a TRUE if the point is over a line (defined by * point1 and point 2). In Addition a threshold can be set, * which defines the weight of those line. - * + * * @param {int} pointX - Point X * @param {int} pointY - Point Y * @param {int} lPoint1X - Line first Point X @@ -5265,7 +5265,7 @@ ORYX.Core.Math.midPoint = function(point1, point2) { ORYX.Core.Math.isPointInLine = function (pointX, pointY, lPoint1X, lPoint1Y, lPoint2X, lPoint2Y, offset) { offset = offset ? Math.abs(offset) : 1; - + // Check if the edge is vertical if(Math.abs(lPoint1X-lPoint2X)<=offset && Math.abs(pointX-lPoint1X)<=offset && pointY-Math.max(lPoint1Y, lPoint2Y)<=offset && Math.min(lPoint1Y, lPoint2Y)-pointY<=offset) { return true @@ -5283,28 +5283,28 @@ ORYX.Core.Math.isPointInLine = function (pointX, pointY, lPoint1X, lPoint1Y, lPo if(pointY > Math.max(lPoint1Y, lPoint2Y) || pointY < Math.min(lPoint1Y, lPoint2Y)) { return false } - + var s = (lPoint1Y - lPoint2Y) / (lPoint1X - lPoint2X); - + return Math.abs(pointY - ((s * pointX) + lPoint1Y - s * lPoint1X)) < offset } /** * Get a boolean if the point is in the polygone - * + * */ ORYX.Core.Math.isPointInEllipse = function (pointX, pointY, cx, cy, rx, ry) { if(cx === undefined || cy === undefined || rx === undefined || ry === undefined) { throw "ORYX.Core.Math.isPointInEllipse needs a ellipse with these properties: x, y, radiusX, radiusY" - } - + } + var tx = (pointX - cx) / rx; var ty = (pointY - cy) / ry; - + return tx * tx + ty * ty < 1.0; } - + /** * Get a boolean if the point is in the polygone * @param {int} pointX @@ -5316,18 +5316,18 @@ ORYX.Core.Math.isPointInPolygone = function(pointX, pointY, polygone){ if (arguments.length < 3) { throw "ORYX.Core.Math.isPointInPolygone needs two arguments" } - + var lastIndex = polygone.length-1; - + if (polygone[0] !== polygone[lastIndex - 1] || polygone[1] !== polygone[lastIndex]) { polygone.push(polygone[0]); polygone.push(polygone[1]); } - + var crossings = 0; var x1, y1, x2, y2, d; - + for (var i = 0; i < polygone.length - 3; ) { x1=polygone[i]; y1=polygone[++i]; @@ -5347,9 +5347,9 @@ ORYX.Core.Math.isPointInPolygone = function(pointX, pointY, polygone){ } /** - * Calculates the distance between a point and a line. It is also testable, if + * Calculates the distance between a point and a line. It is also testable, if * the distance orthogonal to the line, matches the segment of the line. - * + * * @param {float} lineP1 * The starting point of the line segment * @param {float} lineP2 @@ -5360,27 +5360,27 @@ ORYX.Core.Math.isPointInPolygone = function(pointX, pointY, polygone){ * Flag to signal if only the segment of the line shell be evaluated. */ ORYX.Core.Math.distancePointLinie = function( - lineP1, - lineP2, - point, + lineP1, + lineP2, + point, toSegmentOnly) { - - var intersectionPoint = - ORYX.Core.Math.getPointOfIntersectionPointLine(lineP1, - lineP2, - point, + + var intersectionPoint = + ORYX.Core.Math.getPointOfIntersectionPointLine(lineP1, + lineP2, + point, toSegmentOnly); - + if(!intersectionPoint) { return null; } - + return ORYX.Core.Math.getDistancePointToPoint(point, intersectionPoint); }; /** * Calculates the distance between two points. - * + * * @param {point} point1 * @param {point} point2 */ @@ -5390,7 +5390,7 @@ ORYX.Core.Math.getDistancePointToPoint = function(point1, point2) { /** * Calculates the relative distance of a point which is between two other points. - * + * * @param {point} between1 * @param {point} between2 * @param {point} point @@ -5404,13 +5404,13 @@ ORYX.Core.Math.getDistanceBetweenTwoPoints = function(between1, between2, point) /** * Returns true, if the point is of the left hand * side of the regarding the line. - * + * * @param {point} lineP1 Line first point * @param {point} lineP2 Line second point * @param {point} point */ ORYX.Core.Math.pointIsLeftOfLine = function(lineP1, lineP2, point){ - + var vec1 = ORYX.Core.Math.getVector(lineP1, lineP2); var vec2 = ORYX.Core.Math.getVector(lineP1, point); // if the cross produkt is more than 0 @@ -5419,20 +5419,20 @@ ORYX.Core.Math.pointIsLeftOfLine = function(lineP1, lineP2, point){ /** * Calculates the a point which is relatively between two other points. - * + * * @param {point} point1 * @param {point} point2 * @param {number} relative Relative which is between 0 and 1 */ ORYX.Core.Math.getPointBetweenTwoPoints = function(point1, point2, relative) { relative = Math.max(Math.min(relative || 0, 1), 0); - + if (relative === 0){ return point1; } else if (relative === 1){ return point2; } - + return { x: point1.x + ((point2.x - point1.x) * relative), y: point1.y + ((point2.y - point1.y) * relative) @@ -5454,20 +5454,20 @@ ORYX.Core.Math.getVector = function(point1, point2){ } /** - * Returns the an identity vector of the given vector, + * Returns the an identity vector of the given vector, * which has the length ot one. * * @param {point} vector - * or + * or * @param {point} point1 * @param {point} point2 */ ORYX.Core.Math.getIdentityVector = function(vector){ - + if (arguments.length == 2){ vector = ORYX.Core.Math.getVector(arguments[0], arguments[1]); } - + var length = Math.sqrt((vector.x*vector.x)+(vector.y*vector.y)) return { x: vector.x / (length || 1), @@ -5488,7 +5488,7 @@ ORYX.Core.Math.getOrthogonalIdentityVector = function(point1, point2){ /** * Returns the intersection point of a line and a point that defines a line * orthogonal to the given line. - * + * * @param {float} lineP1 * The starting point of the line segment * @param {float} lineP2 @@ -5499,42 +5499,42 @@ ORYX.Core.Math.getOrthogonalIdentityVector = function(point1, point2){ * Flag to signal if only the segment of the line shell be evaluated. */ ORYX.Core.Math.getPointOfIntersectionPointLine = function( - lineP1, - lineP2, - point, + lineP1, + lineP2, + point, onSegmentOnly) { - /* + /* * [P3 - P1 - u(P2 - P1)] dot (P2 - P1) = 0 * u =((x3-x1)(x2-x1)+(y3-y1)(y2-y1))/(p2-p1)?? */ - var denominator = Math.pow(lineP2.x - lineP1.x, 2) + var denominator = Math.pow(lineP2.x - lineP1.x, 2) + Math.pow(lineP2.y - lineP1.y, 2); if(denominator == 0) { return undefined; } - - var u = ((point.x - lineP1.x) * (lineP2.x - lineP1.x) + + var u = ((point.x - lineP1.x) * (lineP2.x - lineP1.x) + (point.y - lineP1.y) * (lineP2.y - lineP1.y)) / denominator; - + if(onSegmentOnly) { if (!(0 <= u && u <= 1)) { return undefined; } } - + pointOfIntersection = new Object(); pointOfIntersection.x = lineP1.x + u * (lineP2.x - lineP1.x); - pointOfIntersection.y = lineP1.y + u * (lineP2.y - lineP1.y); - - return pointOfIntersection; + pointOfIntersection.y = lineP1.y + u * (lineP2.y - lineP1.y); + + return pointOfIntersection; }; /** * Translated the point with the given matrix. * @param {Point} point - * @param {Matrix} matrix + * @param {Matrix} matrix * @return {Object} Includes x, y */ ORYX.Core.Math.getTranslatedPoint = function(point, matrix){ @@ -5579,7 +5579,7 @@ ORYX.Core.Math.getDeterminant = function(m){ } /** - * Returns the bounding box of the given node. Translates the + * Returns the bounding box of the given node. Translates the * origin bounding box with the tranlation matrix. * @param {SVGElement} node * @return {Object} Includes x, y, width, height @@ -5591,7 +5591,7 @@ ORYX.Core.Math.getTranslatedBoundingBox = function(node){ var ll = ORYX.Core.Math.getTranslatedPoint({x:bb.x, y:bb.y+bb.height}, matrix); var ur = ORYX.Core.Math.getTranslatedPoint({x:bb.x+bb.width, y:bb.y}, matrix); var lr = ORYX.Core.Math.getTranslatedPoint({x:bb.x+bb.width, y:bb.y+bb.height}, matrix); - + var minPoint = { x: Math.min(ul.x, ll.x, ur.x, lr.x), y: Math.min(ul.y, ll.y, ur.y, lr.y) @@ -5622,7 +5622,7 @@ ORYX.Core.Math.getAngle = function(p1, p2){ var angle = Math.asin(Math.sqrt(Math.pow(p1.y-p2.y, 2)) /(Math.sqrt(Math.pow(p2.x-p1.x, 2)+Math.pow(p1.y-p2.y, 2)))) *180/Math.PI; - + if(p2.x >= p1.x && p2.y <= p1.y) return angle; else if(p2.x < p1.x && p2.y <= p1.y) @@ -5638,9 +5638,9 @@ ORYX.Core.Math.getAngle = function(p1, p2){ * Implementation of the cohen-sutherland algorithm */ new function(){ - + var RIGHT = 2, TOP = 8, BOTTOM = 4, LEFT = 1; - + function computeOutCode (x, y, xmin, ymin, xmax, ymax) { var code = 0; if (y > ymax) @@ -5653,7 +5653,7 @@ new function(){ code |= LEFT; return code; } - + /** * Returns TRUE if the rectangle is over the edge and has intersection points or includes it * @param {Object} x1 Point A of the line @@ -5668,11 +5668,11 @@ new function(){ ORYX.Core.Math.isRectOverLine = function(x1, y1, x2, y2, xmin, ymin, xmax, ymax){ return !!ORYX.Core.Math.clipLineOnRect.apply(ORYX.Core.Math, arguments); } - + /** - * Returns the clipped line on the given rectangle. If there is + * Returns the clipped line on the given rectangle. If there is * no intersection, it will return NULL. - * + * * @param {Object} x1 Point A of the line * @param {Object} y1 * @param {Object} x2 Point B of the line @@ -5686,11 +5686,11 @@ new function(){ //Outcodes for P0, P1, and whatever point lies outside the clip rectangle var outcode0, outcode1, outcodeOut, hhh = 0; var accept = false, done = false; - + //compute outcodes outcode0 = computeOutCode(x1, y1, xmin, ymin, xmax, ymax); outcode1 = computeOutCode(x2, y2, xmin, ymin, xmax, ymax); - + do { if ((outcode0 | outcode1) == 0 ){ accept = true; @@ -5718,7 +5718,7 @@ new function(){ y = y1 + (y2 - y1) * (xmin - x1)/(x2 - x1); x = xmin; } - + //Now we move outside point to intersection point to clip //and get ready for next pass. if (outcodeOut == outcode0) { @@ -5733,7 +5733,7 @@ new function(){ } hhh ++; } while (done != true && hhh < 5000); - + if(accept) { return {a:{x:x1, y:y1}, b:{x:x2, y:y2}}; } @@ -5763,7 +5763,7 @@ if(!ORYX.Core.StencilSet) {ORYX.Core.StencilSet = {};} * Class Stencil * uses Prototpye 1.5.0 * uses Inheritance - * + * * This class represents one stencil of a stencil set. */ ORYX.Core.StencilSet.Stencil = { @@ -5773,29 +5773,29 @@ ORYX.Core.StencilSet.Stencil = { */ construct: function(jsonStencil, namespace, source, stencilSet, propertyPackages, defaultPosition) { arguments.callee.$.construct.apply(this, arguments); // super(); - + // check arguments and set defaults. if(!jsonStencil) throw "Stencilset seems corrupt."; if(!namespace) throw "Stencil does not provide namespace."; if(!source) throw "Stencil does not provide SVG source."; if(!stencilSet) throw "Fatal internal error loading stencilset."; //if(!propertyPackages) throw "Fatal internal error loading stencilset."; - + this._source = source; this._jsonStencil = jsonStencil; this._stencilSet = stencilSet; this._namespace = namespace; this._propertyPackages = propertyPackages; - - if(defaultPosition && !this._jsonStencil.position) + + if(defaultPosition && !this._jsonStencil.position) this._jsonStencil.position = defaultPosition; - + this._view; this._properties = new Hash(); // check stencil consistency and set defaults. /*with(this._jsonStencil) { - + if(!type) throw "Stencil does not provide type."; if((type != "edge") && (type != "node")) throw "Stencil type must be 'edge' or 'node'."; @@ -5809,7 +5809,7 @@ ORYX.Core.StencilSet.Stencil = { // add id of stencil to its roles roles.push(id); }*/ - + //init all JSON values if(!this._jsonStencil.type || !(this._jsonStencil.type === "edge" || this._jsonStencil.type === "node")) { throw "ORYX.Core.StencilSet.Stencil(construct): Type is not defined."; @@ -5824,7 +5824,7 @@ ORYX.Core.StencilSet.Stencil = { if(!this._jsonStencil.description) { this._jsonStencil.description = ""; }; if(!this._jsonStencil.groups) { this._jsonStencil.groups = []; } if(!this._jsonStencil.roles) { this._jsonStencil.roles = []; } - + //add id of stencil to its roles this._jsonStencil.roles.push(this._jsonStencil.id); @@ -5840,39 +5840,39 @@ ORYX.Core.StencilSet.Stencil = { this._jsonStencil.id = namespace + this._jsonStencil.id; this.postProcessProperties(); - + // init serialize callback if(!this._jsonStencil.serialize) { this._jsonStencil.serialize = {}; //this._jsonStencil.serialize = function(shape, data) { return data;}; } - + // init deserialize callback if(!this._jsonStencil.deserialize) { this._jsonStencil.deserialize = {}; //this._jsonStencil.deserialize = function(shape, data) { return data;}; } - + // init layout callback if(!this._jsonStencil.layout) { this._jsonStencil.layout = [] //this._jsonStencil.layout = function() {return true;} } - + //TODO does not work correctly, if the url does not exist //How to guarantee that the view is loaded correctly before leaving the constructor??? var url = source + "view/" + jsonStencil.view; // override content type when this is webkit. - + if(this._jsonStencil.view.trim().match(/ 0); }, - + getRepositoryEntries: function() { return (this._jsonStencil.repositoryEntries) ? $A(this._jsonStencil.repositoryEntries) : $A([]); }, - + properties: function() { return this._properties.values(); }, @@ -5990,7 +5990,7 @@ ORYX.Core.StencilSet.Stencil = { roles: function() { return this._jsonStencil.roles; }, - + defaultAlign: function() { if(!this._jsonStencil.defaultAlign) return "east"; @@ -6001,12 +6001,12 @@ ORYX.Core.StencilSet.Stencil = { return this._jsonStencil.serialize; //return this._jsonStencil.serialize(shape, data); }, - + deserialize: function(shape, data) { return this._jsonStencil.deserialize; //return this._jsonStencil.deserialize(shape, data); }, - + // in which case is targetShape used? // layout: function(shape, targetShape) { // return this._jsonStencil.layout(shape, targetShape); @@ -6015,14 +6015,14 @@ ORYX.Core.StencilSet.Stencil = { layout: function(shape) { return this._jsonStencil.layout }, - + addProperty: function(property, namespace) { if(property && namespace) { var oProp = new ORYX.Core.StencilSet.Property(property, namespace, this); this._properties[oProp.prefix() + "-" + oProp.id()] = oProp; } }, - + removeProperty: function(propertyId) { if(propertyId) { var oProp = this._properties.values().find(function(prop) { @@ -6034,24 +6034,24 @@ ORYX.Core.StencilSet.Stencil = { }, _loadSVGOnSuccess: function(result) { - + var xml = null; - + /* * We want to get a dom object for the requested file. Unfortunately, * safari has some issues here. this is meant as a fallback for all * browsers that don't recognize the svg mimetype as XML but support * data: urls on Ajax calls. */ - + // responseXML != undefined. // if(!(result.responseXML)) - + // get the dom by data: url. // xml = _evenMoreEvilHack(result.responseText, 'text/xml'); - + // else - + // get it the usual way. xml = result.responseXML; @@ -6059,7 +6059,7 @@ ORYX.Core.StencilSet.Stencil = { if( ORYX.Editor.checkClassType( xml.documentElement, SVGSVGElement )) { this._view = xml.documentElement; - + } else { throw "ORYX.Core.StencilSet.Stencil(_loadSVGOnSuccess): The response is not a SVG document." } @@ -6081,12 +6081,12 @@ ORYX.Core.StencilSet.Stencil = Clazz.extend(ORYX.Core.StencilSet.Stencil); * @param {Object} contentType */ function _evenMoreEvilHack(str, contentType) { - + /* * This even more evil hack was taken from * http://web-graphics.com/mtarchive/001606.php#chatty004999 */ - + if (window.ActiveXObject) { var d = new ActiveXObject("MSXML.DomDocument"); d.loadXML(str); @@ -6109,27 +6109,27 @@ function _evenMoreEvilHack(str, contentType) { * @param {Object} result the xml document object. */ function _evilSafariHack(serializedXML) { - + /* * The Dave way. Taken from: * http://web-graphics.com/mtarchive/001606.php - * + * * There is another possibility to parse XML in Safari, by implementing * the DOMParser in javascript. However, in the latest nightlies of * WebKit, DOMParser is already available, but still buggy. So, this is * the best compromise for the time being. - */ - + */ + var xml = serializedXML; var url = "data:text/xml;charset=utf-8," + encodeURIComponent(xml); var dom = null; - + // your standard AJAX stuff var req = new XMLHttpRequest(); req.open("GET", url); req.onload = function() { dom = req.responseXML; } req.send(null); - + return dom; } /* @@ -6167,23 +6167,23 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ */ construct: function(jsonProp, namespace, stencil){ arguments.callee.$.construct.apply(this, arguments); - + this._jsonProp = jsonProp || ORYX.Log.error("Parameter jsonProp is not defined."); this._namespace = namespace || ORYX.Log.error("Parameter namespace is not defined."); this._stencil = stencil || ORYX.Log.error("Parameter stencil is not defined."); - + this._items = {}; this._complexItems = {}; - - // Flag to indicate whether or not the property should be hidden + + // Flag to indicate whether or not the property should be hidden // This can be for example when the stencil set is upgraded, but the model // has a value for that specific property filled in which we still want to show. // If the value is missing, the property can simply be not shown. this._hidden = false; - + jsonProp.id = jsonProp.id || ORYX.Log.error("ORYX.Core.StencilSet.Property(construct): Id is not defined."); jsonProp.id = jsonProp.id.toLowerCase(); - + if (!jsonProp.type) { ORYX.Log.info("Type is not defined for stencil '%0', id '%1'. Falling back to 'String'.", stencil, jsonProp.id); jsonProp.type = "string"; @@ -6191,14 +6191,14 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ else { jsonProp.type = jsonProp.type.toLowerCase(); } - + jsonProp.prefix = jsonProp.prefix || "oryx"; jsonProp.title = jsonProp.title || ""; jsonProp.value = jsonProp.value || ""; jsonProp.description = jsonProp.description || ""; jsonProp.readonly = jsonProp.readonly || false; jsonProp.optional = jsonProp.optional !== false; - + //init refToView if (this._jsonProp.refToView) { if (!(this._jsonProp.refToView instanceof Array)) { @@ -6208,75 +6208,75 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ else { this._jsonProp.refToView = []; } - + var globalMin = this.getMinForType(jsonProp.type); if (jsonProp.min === undefined || jsonProp.min === null) { jsonProp.min =globalMin; } else if (jsonProp.min < globalMin) { jsonProp.min = globalMin; } - + var globalMax = this.getMaxForType(jsonProp.type); if (jsonProp.max === undefined || jsonProp.max === null) { jsonProp.max = globalMax; } else if (jsonProp.max > globalMax) { jsonProp.min = globalMax; } - + if (!jsonProp.fillOpacity) { jsonProp.fillOpacity = false; } - + if ("number" != typeof jsonProp.lightness) { jsonProp.lightness = 1; } else { jsonProp.lightness = Math.max(0, Math.min(1, jsonProp.lightness)); } - + if (!jsonProp.strokeOpacity) { jsonProp.strokeOpacity = false; } - + if (jsonProp.length === undefined || jsonProp.length === null) { jsonProp.length = Number.MAX_VALUE; } - + if (!jsonProp.wrapLines) { jsonProp.wrapLines = false; } - + if (!jsonProp.dateFormat) { jsonProp.dateFormat = ORYX.I18N.PropertyWindow.dateFormat || "m/d/y"; } - + if (!jsonProp.fill) { jsonProp.fill = false; } - + if (!jsonProp.stroke) { jsonProp.stroke = false; } - + if(!jsonProp.inverseBoolean) { jsonProp.inverseBoolean = false; } - + if(!jsonProp.directlyEditable && jsonProp.directlyEditable != false) { jsonProp.directlyEditable = true; } - + if(jsonProp.visible !== false) { jsonProp.visible = true; } - + if(jsonProp.isList !== true) { jsonProp.isList = false; - + if(!jsonProp.list || !(jsonProp.list instanceof Array)) { jsonProp.list = []; - } + } } - + if(!jsonProp.category) { if (jsonProp.popular) { jsonProp.category = "popular"; @@ -6284,11 +6284,11 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ jsonProp.category = "others"; } } - + if(!jsonProp.alwaysAppearInMultiselect) { jsonProp.alwaysAppearInMultiselect = false; } - + if (jsonProp.type === ORYX.CONFIG.TYPE_CHOICE) { if (jsonProp.items && jsonProp.items instanceof Array) { jsonProp.items.each((function(jsonItem){ @@ -6301,7 +6301,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ } // extended by Kerstin (start) } - else + else if (jsonProp.type === ORYX.CONFIG.TYPE_COMPLEX || jsonProp.type == ORYX.CONFIG.TYPE_MULTIPLECOMPLEX) { if (jsonProp.complexItems && jsonProp.complexItems instanceof Array) { jsonProp.complexItems.each((function(jsonComplexItem){ @@ -6311,14 +6311,14 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ } // extended by Kerstin (end) }, - + getMinForType : function(type) { if (type.toLowerCase() == ORYX.CONFIG.TYPE_INTEGER) { return -Math.pow(2,31) } else { return -Number.MAX_VALUE+1; } - }, + }, getMaxForType : function(type) { if (type.toLowerCase() == ORYX.CONFIG.TYPE_INTEGER) { return Math.pow(2,31)-1 @@ -6326,7 +6326,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ return Number.MAX_VALUE; } }, - + /** * @param {ORYX.Core.StencilSet.Property} property * @return {Boolean} True, if property has the same namespace and id. @@ -6335,67 +6335,67 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ return (this._namespace === property.namespace() && this.id() === property.id()) ? true : false; }, - + namespace: function(){ return this._namespace; }, - + stencil: function(){ return this._stencil; }, - + id: function(){ return this._jsonProp.id; }, - + prefix: function(){ return this._jsonProp.prefix; }, - + type: function(){ return this._jsonProp.type; }, - + inverseBoolean: function() { return this._jsonProp.inverseBoolean; }, - + category: function() { return this._jsonProp.category; }, - + setCategory: function(value) { this._jsonProp.category = value; }, - + directlyEditable: function() { return this._jsonProp.directlyEditable; }, - + visible: function() { return this._jsonProp.visible; }, - + title: function(){ return ORYX.Core.StencilSet.getTranslation(this._jsonProp, "title"); }, - + value: function(){ return this._jsonProp.value; }, - + readonly: function(){ return this._jsonProp.readonly; }, - + optional: function(){ return this._jsonProp.optional; }, - + description: function(){ return ORYX.Core.StencilSet.getTranslation(this._jsonProp, "description"); }, - + /** * An optional link to a SVG element so that the property affects the * graphical representation of the stencil. @@ -6403,21 +6403,21 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ refToView: function(){ return this._jsonProp.refToView; }, - + /** * If type is integer or float, min is the lower bounds of value. */ min: function(){ return this._jsonProp.min; }, - + /** * If type ist integer or float, max is the upper bounds of value. */ max: function(){ return this._jsonProp.max; }, - + /** * If type is float, this method returns if the fill-opacity property should * be set. @@ -6426,7 +6426,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ fillOpacity: function(){ return this._jsonProp.fillOpacity; }, - + /** * If type is float, this method returns if the stroke-opacity property should * be set. @@ -6435,7 +6435,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ strokeOpacity: function(){ return this._jsonProp.strokeOpacity; }, - + /** * If type is string or richtext, length is the maximum length of the text. * TODO how long can a string be. @@ -6443,11 +6443,11 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ length: function(){ return this._jsonProp.length ? this._jsonProp.length : Number.MAX_VALUE; }, - + wrapLines: function(){ return this._jsonProp.wrapLines; }, - + /** * If type is date, dateFormat specifies the format of the date. The format * specification of the ext library is used: @@ -6488,7 +6488,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ dateFormat: function(){ return this._jsonProp.dateFormat; }, - + /** * If type is color, this method returns if the fill property should * be set. @@ -6497,7 +6497,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ fill: function(){ return this._jsonProp.fill; }, - + /** * Lightness defines the satiation of the color * 0 is the pure color @@ -6507,7 +6507,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ lightness: function(){ return this._jsonProp.lightness; }, - + /** * If type is color, this method returns if the stroke property should * be set. @@ -6516,7 +6516,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ stroke: function(){ return this._jsonProp.stroke; }, - + /** * If type is choice, items is a hash map with all alternative values * (PropertyItem objects) with id as keys. @@ -6524,7 +6524,7 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ items: function(){ return $H(this._items).values(); }, - + item: function(value){ if (value) { return this._items[value.toLowerCase()]; @@ -6532,66 +6532,66 @@ ORYX.Core.StencilSet.Property = Clazz.extend({ return null; } }, - + toString: function(){ return "Property " + this.title() + " (" + this.id() + ")"; }, - + complexItems: function(){ return $H(this._complexItems).values(); }, - + complexItem: function(id){ if(id) { return this._complexItems[id.toLowerCase()]; } else { return null; } - + }, - + complexAttributeToView: function(){ return this._jsonProp.complexAttributeToView || ""; }, - + isList: function() { return !!this._jsonProp.isList; }, - + getListItems: function() { return this._jsonProp.list; }, - + /** - * If type is glossary link, the + * If type is glossary link, the * type of category can be defined where * the link only can go to. - * @return {String} The glossary category id + * @return {String} The glossary category id */ linkableType: function(){ return this._jsonProp.linkableType || ""; }, - + alwaysAppearInMultiselect : function() { return this._jsonProp.alwaysAppearInMultiselect; }, - + popular: function() { return this._jsonProp.popular || false; }, - + setPopular: function() { this._jsonProp.popular = true; }, - + hide: function() { this._hidden = true; }, - + isHidden: function() { return this._hidden; } - + }); /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -6632,16 +6632,16 @@ ORYX.Core.StencilSet.PropertyItem = Clazz.extend({ if(!property) { throw "ORYX.Core.StencilSet.PropertyItem(construct): Parameter property is not defined."; } - + this._jsonItem = jsonItem; this._namespace = namespace; this._property = property; - + //init all values if(!jsonItem.value) { throw "ORYX.Core.StencilSet.PropertyItem(construct): Value is not defined."; } - + if(this._jsonItem.refToView) { if(!(this._jsonItem.refToView instanceof Array)) { this._jsonItem.refToView = [this._jsonItem.refToView]; @@ -6671,7 +6671,7 @@ ORYX.Core.StencilSet.PropertyItem = Clazz.extend({ value: function() { return this._jsonItem.value; }, - + title: function() { return ORYX.Core.StencilSet.getTranslation(this._jsonItem, "title"); }, @@ -6679,7 +6679,7 @@ ORYX.Core.StencilSet.PropertyItem = Clazz.extend({ refToView: function() { return this._jsonItem.refToView; }, - + icon: function() { return (this._jsonItem.icon) ? this.property().stencil()._source + "icons/" + this._jsonItem.icon : ""; }, @@ -6724,24 +6724,24 @@ ORYX.Core.StencilSet.ComplexPropertyItem = Clazz.extend({ if(!property) { throw "ORYX.Core.StencilSet.ComplexPropertyItem(construct): Parameter property is not defined."; } - + this._jsonItem = jsonItem; this._namespace = namespace; this._property = property; this._items = new Hash(); this._complexItems = new Hash(); - + //init all values if(!jsonItem.name) { throw "ORYX.Core.StencilSet.ComplexPropertyItem(construct): Name is not defined."; } - + if(!jsonItem.type) { throw "ORYX.Core.StencilSet.ComplexPropertyItem(construct): Type is not defined."; } else { jsonItem.type = jsonItem.type.toLowerCase(); } - + if(jsonItem.type === ORYX.CONFIG.TYPE_CHOICE) { if(jsonItem.items && jsonItem.items instanceof Array) { jsonItem.items.each((function(item) { @@ -6781,35 +6781,35 @@ ORYX.Core.StencilSet.ComplexPropertyItem = Clazz.extend({ name: function() { return ORYX.Core.StencilSet.getTranslation(this._jsonItem, "name"); }, - + id: function() { return this._jsonItem.id; }, - + type: function() { return this._jsonItem.type; }, - + optional: function() { return this._jsonItem.optional; }, - + width: function() { return this._jsonItem.width; }, - + value: function() { return this._jsonItem.value; }, - + items: function() { return this._items.values(); }, - + complexItems: function() { return this._complexItems.values(); }, - + disable: function() { return this._jsonItem.disable; } @@ -6832,7 +6832,7 @@ if(!ORYX.Core.StencilSet) {ORYX.Core.StencilSet = {};} /** * Class Rules uses Prototpye 1.5.0 uses Inheritance - * + * * This class implements the API to check the stencil sets' rules. */ ORYX.Core.StencilSet.Rules = { @@ -6846,7 +6846,7 @@ ORYX.Core.StencilSet.Rules = { this._stencilSets = []; this._stencils = []; this._containerStencils = []; - + this._cachedConnectSET = new Hash(); this._cachedConnectSE = new Hash(); this._cachedConnectTE = new Hash(); @@ -6854,23 +6854,23 @@ ORYX.Core.StencilSet.Rules = { this._cachedCardTE = new Hash(); this._cachedContainPC = new Hash(); this._cachedMorphRS = new Hash(); - + this._connectionRules = new Hash(); this._cardinalityRules = new Hash(); this._containmentRules = new Hash(); this._morphingRules = new Hash(); this._layoutRules = new Hash(); }, - + /** * Call this method to initialize the rules for a stencil set and all of its * active extensions. - * + * * @param {Object} * stencilSet */ initializeRules: function(stencilSet) { - + var existingSS = this._stencilSets.find(function(ss) { return (ss.namespace() == stencilSet.namespace()); }); @@ -6879,11 +6879,11 @@ ORYX.Core.StencilSet.Rules = { var stencilsets = this._stencilSets.clone(); stencilsets = stencilsets.without(existingSS); stencilsets.push(stencilSet); - + this._stencilSets = []; this._stencils = []; this._containerStencils = []; - + this._cachedConnectSET = new Hash(); this._cachedConnectSE = new Hash(); this._cachedConnectTE = new Hash(); @@ -6891,13 +6891,13 @@ ORYX.Core.StencilSet.Rules = { this._cachedCardTE = new Hash(); this._cachedContainPC = new Hash(); this._cachedMorphRS = new Hash(); - + this._connectionRules = new Hash(); this._cardinalityRules = new Hash(); this._containmentRules = new Hash(); this._morphingRules = new Hash(); this._layoutRules = new Hash(); - + stencilsets.each(function(ss){ this.initializeRules(ss); }.bind(this)); @@ -6905,11 +6905,11 @@ ORYX.Core.StencilSet.Rules = { } else { this._stencilSets.push(stencilSet); - + var jsonRules = new Hash(stencilSet.jsonRules()); var namespace = stencilSet.namespace(); var stencils = stencilSet.stencils(); - + stencilSet.extensions().values().each(function(extension) { if(extension.rules) { if(extension.rules.connectionRules) @@ -6921,12 +6921,12 @@ ORYX.Core.StencilSet.Rules = { if(extension.rules.morphingRules) jsonRules.morphingRules = jsonRules.morphingRules.concat(extension.rules.morphingRules); } - if(extension.stencils) + if(extension.stencils) stencils = stencils.concat(extension.stencils); }); - + this._stencils = this._stencils.concat(stencilSet.stencils()); - + // init connection rules var cr = this._connectionRules; if (jsonRules.connectionRules) { @@ -6937,10 +6937,10 @@ ORYX.Core.StencilSet.Rules = { } } else { - if (!cr[namespace + rules.role]) + if (!cr[namespace + rules.role]) cr[namespace + rules.role] = new Hash(); } - + rules.connects.each((function(connect){ var toRoles = []; if (connect.to) { @@ -6956,27 +6956,27 @@ ORYX.Core.StencilSet.Rules = { } }).bind(this)); } - + var role, from; - if (this._isRoleOfOtherNamespace(rules.role)) + if (this._isRoleOfOtherNamespace(rules.role)) role = rules.role; - else + else role = namespace + rules.role; - - if (this._isRoleOfOtherNamespace(connect.from)) + + if (this._isRoleOfOtherNamespace(connect.from)) from = connect.from; - else + else from = namespace + connect.from; - - if (!cr[role][from]) + + if (!cr[role][from]) cr[role][from] = toRoles; - else + else cr[role][from] = cr[role][from].concat(toRoles); - + }).bind(this)); }).bind(this)); } - + // init cardinality rules var cardr = this._cardinalityRules; if (jsonRules.cardinalityRules) { @@ -6988,14 +6988,14 @@ ORYX.Core.StencilSet.Rules = { else { cardrKey = namespace + rules.role; } - + if (!cardr[cardrKey]) { cardr[cardrKey] = {}; for (i in rules) { cardr[cardrKey][i] = rules[i]; } } - + var oe = new Hash(); if (rules.outgoingEdges) { rules.outgoingEdges.each((function(rule){ @@ -7022,7 +7022,7 @@ ORYX.Core.StencilSet.Rules = { cardr[cardrKey].incomingEdges = ie; }).bind(this)); } - + // init containment rules var conr = this._containmentRules; if (jsonRules.containmentRules) { @@ -7048,7 +7048,7 @@ ORYX.Core.StencilSet.Rules = { }).bind(this)); }).bind(this)); } - + // init morphing rules var morphr = this._morphingRules; if (jsonRules.morphingRules) { @@ -7074,11 +7074,11 @@ ORYX.Core.StencilSet.Rules = { }).bind(this)); }).bind(this)); } - + // init layouting rules var layoutRules = this._layoutRules; if (jsonRules.layoutRules) { - + var getDirections = function(o){ return { "edgeRole":o.edgeRole||undefined, @@ -7088,7 +7088,7 @@ ORYX.Core.StencilSet.Rules = { "l": o["l"]||1 } } - + jsonRules.layoutRules.each(function(rules){ var layoutKey; if (this._isRoleOfOtherNamespace(rules.role)) { @@ -7113,145 +7113,145 @@ ORYX.Core.StencilSet.Rules = { layoutRules[layoutKey]["outs"] = (rules["outs"]||[]).map(function(e){ return getDirections(e) }) } }.bind(this)); - } + } } }, - + _getStencilById: function(id) { return this._stencils.find(function(stencil) { return stencil.id()==id; }); }, - + _cacheConnect: function(args) { result = this._canConnect(args); - + if (args.sourceStencil && args.targetStencil) { var source = this._cachedConnectSET[args.sourceStencil.id()]; - + if(!source) { source = new Hash(); this._cachedConnectSET[args.sourceStencil.id()] = source; } - + var edge = source[args.edgeStencil.id()]; - + if(!edge) { edge = new Hash(); source[args.edgeStencil.id()] = edge; } - + edge[args.targetStencil.id()] = result; - + } else if (args.sourceStencil) { var source = this._cachedConnectSE[args.sourceStencil.id()]; - + if(!source) { source = new Hash(); this._cachedConnectSE[args.sourceStencil.id()] = source; } - + source[args.edgeStencil.id()] = result; } else { var target = this._cachedConnectTE[args.targetStencil.id()]; - + if(!target) { target = new Hash(); this._cachedConnectTE[args.targetStencil.id()] = target; } - + target[args.edgeStencil.id()] = result; } - + return result; }, - + _cacheCard: function(args) { - + if(args.sourceStencil) { var source = this._cachedCardSE[args.sourceStencil.id()] - + if(!source) { source = new Hash(); this._cachedCardSE[args.sourceStencil.id()] = source; } - + var max = this._getMaximumNumberOfOutgoingEdge(args); if(max == undefined) max = -1; - + source[args.edgeStencil.id()] = max; - } - + } + if(args.targetStencil) { var target = this._cachedCardTE[args.targetStencil.id()] - + if(!target) { target = new Hash(); this._cachedCardTE[args.targetStencil.id()] = target; } - + var max = this._getMaximumNumberOfIncomingEdge(args); if(max == undefined) max = -1; - + target[args.edgeStencil.id()] = max; } }, - + _cacheContain: function(args) { - - var result = [this._canContain(args), + + var result = [this._canContain(args), this._getMaximumOccurrence(args.containingStencil, args.containedStencil)] - - if(result[1] == undefined) + + if(result[1] == undefined) result[1] = -1; - + var children = this._cachedContainPC[args.containingStencil.id()]; - + if(!children) { children = new Hash(); this._cachedContainPC[args.containingStencil.id()] = children; } - + children[args.containedStencil.id()] = result; - + return result; }, - + /** * Returns all stencils belonging to a morph group. (calculation result is * cached) */ _cacheMorph: function(role) { - + var morphs = this._cachedMorphRS[role]; - + if(!morphs) { morphs = []; - + if(this._morphingRules.keys().include(role)) { morphs = this._stencils.select(function(stencil) { return stencil.roles().include(role); }); } - + this._cachedMorphRS[role] = morphs; } return morphs; }, - + /** Begin connection rules' methods */ - + /** - * + * * @param {Object} * args sourceStencil: ORYX.Core.StencilSet.Stencil | undefined * sourceShape: ORYX.Core.Shape | undefined - * + * * At least sourceStencil or sourceShape has to be specified - * + * * @return {Array} Array of stencils of edges that can be outgoing edges of * the source. */ @@ -7260,14 +7260,14 @@ ORYX.Core.StencilSet.Rules = { if(!args.sourceShape && !args.sourceStencil) { return []; } - + // init arguments if(args.sourceShape) { args.sourceStencil = args.sourceShape.getStencil(); } - + var _edges = []; - + // test each edge, if it can connect to source this._stencils.each((function(stencil) { if(stencil.type() === "edge") { @@ -7283,13 +7283,13 @@ ORYX.Core.StencilSet.Rules = { }, /** - * + * * @param {Object} * args targetStencil: ORYX.Core.StencilSet.Stencil | undefined * targetShape: ORYX.Core.Shape | undefined - * + * * At least targetStencil or targetShape has to be specified - * + * * @return {Array} Array of stencils of edges that can be incoming edges of * the target. */ @@ -7298,14 +7298,14 @@ ORYX.Core.StencilSet.Rules = { if(!args.targetShape && !args.targetStencil) { return []; } - + // init arguments if(args.targetShape) { args.targetStencil = args.targetShape.getStencil(); } - + var _edges = []; - + // test each edge, if it can connect to source this._stencils.each((function(stencil) { if(stencil.type() === "edge") { @@ -7319,38 +7319,38 @@ ORYX.Core.StencilSet.Rules = { return _edges; }, - + /** - * + * * @param {Object} * args edgeStencil: ORYX.Core.StencilSet.Stencil | undefined * edgeShape: ORYX.Core.Edge | undefined targetStencil: * ORYX.Core.StencilSet.Stencil | undefined targetShape: * ORYX.Core.Node | undefined - * + * * At least edgeStencil or edgeShape has to be specified!!! - * + * * @return {Array} Returns an array of stencils that can be source of the * specified edge. */ sourceStencils: function(args) { // check arguments - if(!args || + if(!args || !args.edgeShape && !args.edgeStencil) { return []; } - + // init arguments if(args.targetShape) { args.targetStencil = args.targetShape.getStencil(); } - + if(args.edgeShape) { args.edgeStencil = args.edgeShape.getStencil(); } - + var _sources = []; - + // check each stencil, if it can be a source this._stencils.each((function(stencil) { var newArgs = Object.clone(args); @@ -7362,38 +7362,38 @@ ORYX.Core.StencilSet.Rules = { return _sources; }, - + /** - * + * * @param {Object} * args edgeStencil: ORYX.Core.StencilSet.Stencil | undefined * edgeShape: ORYX.Core.Edge | undefined sourceStencil: * ORYX.Core.StencilSet.Stencil | undefined sourceShape: * ORYX.Core.Node | undefined - * + * * At least edgeStencil or edgeShape has to be specified!!! - * + * * @return {Array} Returns an array of stencils that can be target of the * specified edge. */ targetStencils: function(args) { // check arguments - if(!args || + if(!args || !args.edgeShape && !args.edgeStencil) { return []; } - + // init arguments if(args.sourceShape) { args.sourceStencil = args.sourceShape.getStencil(); } - + if(args.edgeShape) { args.edgeStencil = args.edgeShape.getStencil(); } - + var _targets = []; - + // check stencil, if it can be a target this._stencils.each((function(stencil) { var newArgs = Object.clone(args); @@ -7407,7 +7407,7 @@ ORYX.Core.StencilSet.Rules = { }, /** - * + * * @param {Object} * args edgeStencil: ORYX.Core.StencilSet.Stencil edgeShape: * ORYX.Core.Edge |undefined sourceStencil: @@ -7415,20 +7415,20 @@ ORYX.Core.StencilSet.Rules = { * ORYX.Core.Node |undefined targetStencil: * ORYX.Core.StencilSet.Stencil | undefined targetShape: * ORYX.Core.Node |undefined - * + * * At least source or target has to be specified!!! - * + * * @return {Boolean} Returns, if the edge can connect source and target. */ - canConnect: function(args) { + canConnect: function(args) { // check arguments if(!args || (!args.sourceShape && !args.sourceStencil && !args.targetShape && !args.targetStencil) || !args.edgeShape && !args.edgeStencil) { - return false; + return false; } - + // init arguments if(args.sourceShape) { args.sourceStencil = args.sourceShape.getStencil(); @@ -7439,12 +7439,12 @@ ORYX.Core.StencilSet.Rules = { if(args.edgeShape) { args.edgeStencil = args.edgeShape.getStencil(); } - + var result; - + if(args.sourceStencil && args.targetStencil) { var source = this._cachedConnectSET[args.sourceStencil.id()]; - + if(!source) result = this._cacheConnect(args); else { @@ -7452,7 +7452,7 @@ ORYX.Core.StencilSet.Rules = { if(!edge) result = this._cacheConnect(args); - else { + else { var target = edge[args.targetStencil.id()]; if(target == undefined) @@ -7461,14 +7461,14 @@ ORYX.Core.StencilSet.Rules = { result = target; } } - } else if (args.sourceStencil) { + } else if (args.sourceStencil) { var source = this._cachedConnectSE[args.sourceStencil.id()]; - + if(!source) result = this._cacheConnect(args); else { var edge = source[args.edgeStencil.id()]; - + if(edge == undefined) result = this._cacheConnect(args); else @@ -7476,40 +7476,40 @@ ORYX.Core.StencilSet.Rules = { } } else { // args.targetStencil var target = this._cachedConnectTE[args.targetStencil.id()]; - + if(!target) result = this._cacheConnect(args); else { var edge = target[args.edgeStencil.id()]; - + if(edge == undefined) result = this._cacheConnect(args); else result = edge; } - } - + } + // check cardinality if (result) { if(args.sourceShape) { var source = this._cachedCardSE[args.sourceStencil.id()]; - + if(!source) { this._cacheCard(args); source = this._cachedCardSE[args.sourceStencil.id()]; } - + var max = source[args.edgeStencil.id()]; - + if(max == undefined) { this._cacheCard(args); } - + max = source[args.edgeStencil.id()]; - + if(max != -1) { result = args.sourceShape.getOutgoingShapes().all(function(cs) { - if((cs.getStencil().id() === args.edgeStencil.id()) && + if((cs.getStencil().id() === args.edgeStencil.id()) && ((args.edgeShape) ? cs !== args.edgeShape : true)) { max--; return (max > 0) ? true : false; @@ -7518,24 +7518,24 @@ ORYX.Core.StencilSet.Rules = { } }); } - } - + } + if (args.targetShape) { var target = this._cachedCardTE[args.targetStencil.id()]; - + if(!target) { this._cacheCard(args); target = this._cachedCardTE[args.targetStencil.id()]; } - + var max = target[args.edgeStencil.id()]; - + if(max == undefined) { this._cacheCard(args); } - + max = target[args.edgeStencil.id()]; - + if(max != -1) { result = args.targetShape.getIncomingShapes().all(function(cs){ if ((cs.getStencil().id() === args.edgeStencil.id()) && @@ -7550,12 +7550,12 @@ ORYX.Core.StencilSet.Rules = { } } } - + return result; }, - + /** - * + * * @param {Object} * args edgeStencil: ORYX.Core.StencilSet.Stencil edgeShape: * ORYX.Core.Edge |undefined sourceStencil: @@ -7563,9 +7563,9 @@ ORYX.Core.StencilSet.Rules = { * ORYX.Core.Node |undefined targetStencil: * ORYX.Core.StencilSet.Stencil | undefined targetShape: * ORYX.Core.Node |undefined - * + * * At least source or target has to be specified!!! - * + * * @return {Boolean} Returns, if the edge can connect source and target. */ _canConnect: function(args) { @@ -7574,9 +7574,9 @@ ORYX.Core.StencilSet.Rules = { (!args.sourceShape && !args.sourceStencil && !args.targetShape && !args.targetStencil) || !args.edgeShape && !args.edgeStencil) { - return false; + return false; } - + // init arguments if(args.sourceShape) { args.sourceStencil = args.sourceShape.getStencil(); @@ -7590,7 +7590,7 @@ ORYX.Core.StencilSet.Rules = { // 1. check connection rules var resultCR; - + // get all connection rules for this edge var edgeRules = this._getConnectionRulesOfEdgeStencil(args.edgeStencil); @@ -7604,7 +7604,7 @@ ORYX.Core.StencilSet.Rules = { var targetRoles = edgeRules[sourceRole]; if(!targetRoles) {return false;} - + if(args.targetStencil) { return (targetRoles.any(function(targetRole) { return args.targetStencil.roles().member(targetRole); @@ -7621,7 +7621,7 @@ ORYX.Core.StencilSet.Rules = { }); } } - + return resultCR; }, @@ -7635,7 +7635,7 @@ ORYX.Core.StencilSet.Rules = { }, /** - * + * * @param {Object} * args containingStencil: ORYX.Core.StencilSet.Stencil * containingShape: ORYX.Core.AbstractShape containedStencil: @@ -7647,30 +7647,30 @@ ORYX.Core.StencilSet.Rules = { !args.containedStencil && !args.containedShape) { return false; } - + // init arguments if(args.containedShape) { args.containedStencil = args.containedShape.getStencil(); } - + if(args.containingShape) { args.containingStencil = args.containingShape.getStencil(); } - + //if(args.containingStencil.type() == 'edge' || args.containedStencil.type() == 'edge') // return false; - if(args.containedStencil.type() == 'edge') + if(args.containedStencil.type() == 'edge') return false; - + var childValues; - + var parent = this._cachedContainPC[args.containingStencil.id()]; - + if(!parent) childValues = this._cacheContain(args); else { childValues = parent[args.containedStencil.id()]; - + if(!childValues) childValues = this._cacheContain(args); } @@ -7695,9 +7695,9 @@ ORYX.Core.StencilSet.Rules = { } } }, - + /** - * + * * @param {Object} * args containingStencil: ORYX.Core.StencilSet.Stencil * containingShape: ORYX.Core.AbstractShape containedStencil: @@ -7709,16 +7709,16 @@ ORYX.Core.StencilSet.Rules = { !args.containedStencil && !args.containedShape) { return false; } - + // init arguments if(args.containedShape) { args.containedStencil = args.containedShape.getStencil(); } - + if(args.containingShape) { args.containingStencil = args.containingShape.getStencil(); } - + // if(args.containingShape) { // if(args.containingShape instanceof ORYX.Core.Edge) { // // edges cannot contain other shapes @@ -7726,9 +7726,9 @@ ORYX.Core.StencilSet.Rules = { // } // } - + var result; - + // check containment rules result = args.containingStencil.roles().any((function(role) { var roles = this._containmentRules[role]; @@ -7740,24 +7740,24 @@ ORYX.Core.StencilSet.Rules = { return false; } }).bind(this)); - + return result; }, - + /** End containment rules' methods */ - - + + /** Begin morphing rules' methods */ - + /** - * + * * @param {Object} - * args - * stencil: ORYX.Core.StencilSet.Stencil | undefined + * args + * stencil: ORYX.Core.StencilSet.Stencil | undefined * shape: ORYX.Core.Shape | undefined - * + * * At least stencil or shape has to be specified - * + * * @return {Array} Array of stencils that the passed stencil/shape can be * transformed to (including the current stencil itself) */ @@ -7766,12 +7766,12 @@ ORYX.Core.StencilSet.Rules = { if(!args.stencil && !args.shape) { return []; } - + // init arguments if(args.shape) { args.stencil = args.shape.getStencil(); } - + var _morphStencils = []; args.stencil.roles().each(function(role) { this._cacheMorph(role).each(function(stencil) { @@ -7785,7 +7785,7 @@ ORYX.Core.StencilSet.Rules = { _morphStencils = _morphStencils.uniq().sort(function(a,b){ return baseMorphs.include(a)&&!baseMorphs.include(b) ? -1 : (baseMorphs.include(b)&&!baseMorphs.include(a) ? 1 : 0)}) return _morphStencils; }, - + /** * @return {Array} An array of all base morph stencils */ @@ -7798,40 +7798,40 @@ ORYX.Core.StencilSet.Rules = { }); return _baseMorphs; }, - + /** * Returns true if there are morphing rules defines - * @return {boolean} + * @return {boolean} */ containsMorphingRules: function(){ return this._stencilSets.any(function(ss){ return !!ss.jsonRules().morphingRules}); }, - + /** - * + * * @param {Object} - * args + * args * sourceStencil: - * ORYX.Core.StencilSet.Stencil | undefined + * ORYX.Core.StencilSet.Stencil | undefined * sourceShape: - * ORYX.Core.Node |undefined + * ORYX.Core.Node |undefined * targetStencil: - * ORYX.Core.StencilSet.Stencil | undefined + * ORYX.Core.StencilSet.Stencil | undefined * targetShape: * ORYX.Core.Node |undefined - * - * - * @return {Stencil} Returns, the stencil for the connecting edge + * + * + * @return {Stencil} Returns, the stencil for the connecting edge * or null if connection is not possible */ - connectMorph: function(args) { + connectMorph: function(args) { // check arguments if(!args || (!args.sourceShape && !args.sourceStencil && !args.targetShape && !args.targetStencil)) { - return false; + return false; } - + // init arguments if(args.sourceShape) { args.sourceStencil = args.sourceShape.getStencil(); @@ -7839,21 +7839,21 @@ ORYX.Core.StencilSet.Rules = { if(args.targetShape) { args.targetStencil = args.targetShape.getStencil(); } - + var incoming = this.incomingEdgeStencils(args); var outgoing = this.outgoingEdgeStencils(args); - + var edgeStencils = incoming.select(function(e) { return outgoing.member(e); }); // intersection of sets var baseEdgeStencils = this.baseMorphs().select(function(e) { return edgeStencils.member(e); }); // again: intersection of sets - + if(baseEdgeStencils.size()>0) return baseEdgeStencils[0]; // return any of the possible base morphs else if(edgeStencils.size()>0) return edgeStencils[0]; // return any of the possible stencils - + return null; //connection not possible }, - + /** * Return true if the stencil should be located in the shape menu * @param {ORYX.Core.StencilSet.Stencil} morph @@ -7864,28 +7864,28 @@ ORYX.Core.StencilSet.Rules = { return this._stencilSets.any(function(ss){ return ss.jsonRules().morphingRules .any(function(r){ - return stencil.roles().include(ss.namespace() + r.role) + return stencil.roles().include(ss.namespace() + r.role) && r.showInShapeMenu !== false; }) }); }, - + preserveBounds: function(stencil) { return this._stencilSets.any(function(ss) { return ss.jsonRules().morphingRules.any(function(r) { - - - return stencil.roles().include(ss.namespace() + r.role) + + + return stencil.roles().include(ss.namespace() + r.role) && r.preserveBounds; }) }) }, - + /** End morphing rules' methods */ /** Begin layouting rules' methods */ - + /** * Returns a set on "in" and "out" layouting rules for a given shape * @param {Object} shape @@ -7893,11 +7893,11 @@ ORYX.Core.StencilSet.Rules = { * @return {Object} "in" and "out" with a default value of {"t":1, "r":1, "b":1, "r":1} if not specified in the json */ getLayoutingRules : function(shape, edgeShape){ - + if (!shape||!(shape instanceof ORYX.Core.Shape)){ return } - + var layout = {"in":{},"out":{}}; - + var parseValues = function(o, v){ if (o && o[v]){ ["t","r","b","l"].each(function(d){ @@ -7915,7 +7915,7 @@ ORYX.Core.StencilSet.Rules = { }.bind(this)); } }.bind(this) - + // For each role shape.getStencil().roles().each(function(role) { // check if there are layout information @@ -7925,7 +7925,7 @@ ORYX.Core.StencilSet.Rules = { parseValues(this._layoutRules[role], "out"); } }.bind(this)); - + // Make sure, that every attribute has an value, // otherwise set 1 ["in","out"].each(function(v){ @@ -7933,31 +7933,31 @@ ORYX.Core.StencilSet.Rules = { layout[v][d]=layout[v][d]!==undefined?layout[v][d]:1; }); }) - + return layout; }, - + /** End layouting rules' methods */ - + /** Helper methods */ /** - * Checks wether a shape contains the given role or the role is equal the stencil id + * Checks wether a shape contains the given role or the role is equal the stencil id * @param {ORYX.Core.Shape} shape * @param {String} role */ _hasRole: function(shape, role){ if (!(shape instanceof ORYX.Core.Shape)||!role){ return } var isRole = shape.getStencil().roles().any(function(r){ return r == role}); - + return isRole || shape.getStencil().id() == (shape.getStencil().namespace()+role); }, /** - * + * * @param {String} * role - * + * * @return {Array} Returns an array of stencils that can act as role. */ _stencilsWithRole: function(role) { @@ -7965,12 +7965,12 @@ ORYX.Core.StencilSet.Rules = { return (stencil.roles().member(role)) ? true : false; }); }, - + /** - * + * * @param {String} * role - * + * * @return {Array} Returns an array of stencils that can act as role and * have the type 'edge'. */ @@ -7979,12 +7979,12 @@ ORYX.Core.StencilSet.Rules = { return (stencil.roles().member(role) && stencil.type() === "edge") ? true : false; }); }, - + /** - * + * * @param {String} * role - * + * * @return {Array} Returns an array of stencils that can act as role and * have the type 'node'. */ @@ -7995,12 +7995,12 @@ ORYX.Core.StencilSet.Rules = { }, /** - * + * * @param {ORYX.Core.StencilSet.Stencil} * parent * @param {ORYX.Core.StencilSet.Stencil} * child - * + * * @returns {Boolean} Returns the maximum occurrence of shapes of the * stencil's type inside the parent. */ @@ -8022,11 +8022,11 @@ ORYX.Core.StencilSet.Rules = { /** - * + * * @param {Object} * args sourceStencil: ORYX.Core.Node edgeStencil: * ORYX.Core.StencilSet.Stencil - * + * * @return {Boolean} Returns, the maximum number of outgoing edges of the * type specified by edgeStencil of the sourceShape. */ @@ -8036,7 +8036,7 @@ ORYX.Core.StencilSet.Rules = { !args.edgeStencil) { return false; } - + var max; args.sourceStencil.roles().each((function(role) { var cardRule = this._cardinalityRules[role]; @@ -8058,13 +8058,13 @@ ORYX.Core.StencilSet.Rules = { return max; }, - + /** - * + * * @param {Object} * args targetStencil: ORYX.Core.StencilSet.Stencil edgeStencil: * ORYX.Core.StencilSet.Stencil - * + * * @return {Boolean} Returns the maximum number of incoming edges of the * type specified by edgeStencil of the targetShape. */ @@ -8074,7 +8074,7 @@ ORYX.Core.StencilSet.Rules = { !args.edgeStencil) { return false; } - + var max; args.targetStencil.roles().each((function(role) { var cardRule = this._cardinalityRules[role]; @@ -8094,12 +8094,12 @@ ORYX.Core.StencilSet.Rules = { return max; }, - + /** - * + * * @param {ORYX.Core.StencilSet.Stencil} * edgeStencil - * + * * @return {Hash} Returns a hash map of all connection rules for * edgeStencil. */ @@ -8116,10 +8116,10 @@ ORYX.Core.StencilSet.Rules = { }); } }).bind(this)); - + return edgeRules; }, - + _isRoleOfOtherNamespace: function(role) { return (role.indexOf("#") > 0); }, @@ -8164,36 +8164,36 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ */ construct: function(source, modelMetaData, editorId){ arguments.callee.$.construct.apply(this, arguments); - + if (!source) { throw "ORYX.Core.StencilSet.StencilSet(construct): Parameter 'source' is not defined."; } - + if (source.endsWith("/")) { source = source.substr(0, source.length - 1); } - + this._extensions = new Hash(); - + this._source = source; this._baseUrl = source.substring(0, source.lastIndexOf("/") + 1); - + this._jsonObject = {}; - + this._stencils = new Hash(); this._availableStencils = new Hash(); - + if(ORYX.CONFIG.BACKEND_SWITCH) { this._baseUrl = "editor/stencilsets/bpmn2.0/"; this._source = "stencilsets/bpmn2.0/bpmn2.0.json"; - + new Ajax.Request(ACTIVITI.CONFIG.contextRoot + '/editor/stencilset?version=' + Date.now(), { asynchronous: false, method: 'get', onSuccess: this._init.bind(this), onFailure: this._cancelInit.bind(this) }); - + } else { new Ajax.Request(source, { asynchronous: false, @@ -8202,23 +8202,23 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ onFailure: this._cancelInit.bind(this) }); } - - if (this.errornous) + + if (this.errornous) throw "Loading stencil set " + source + " failed."; }, - + /** * Finds a root stencil in this stencil set. There may be many of these. If * there are, the first one found will be used. In Firefox, this is the * topmost definition in the stencil set description file. */ findRootStencilName: function(){ - + // find any stencil that may be root. var rootStencil = this._stencils.values().find(function(stencil){ return stencil._jsonStencil.mayBeRoot }); - + // if there is none, just guess the first. if (!rootStencil) { ORYX.Log.warn("Did not find any stencil that may be root. Taking a guess."); @@ -8228,7 +8228,7 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ // return its id. return rootStencil.id(); }, - + /** * @param {ORYX.Core.StencilSet.StencilSet} stencilSet * @return {Boolean} True, if stencil set has the same namespace. @@ -8236,9 +8236,9 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ equals: function(stencilSet){ return (this.namespace() === stencilSet.namespace()); }, - + /** - * + * * @param {Oryx.Core.StencilSet.Stencil} rootStencil If rootStencil is defined, it only returns stencils * that could be (in)direct child of that stencil. */ @@ -8247,9 +8247,9 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ var stencils = this._availableStencils.values(); var containers = [rootStencil]; var checkedContainers = []; - + var result = []; - + while (containers.size() > 0) { var container = containers.pop(); checkedContainers.push(container); @@ -8267,26 +8267,26 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } result = result.concat(children).uniq(); } - + // Sort the result to the origin order result = result.sortBy(function(stencil) { return stencils.indexOf(stencil); }); - - + + if(sortByGroup) { result = result.sortBy(function(stencil) { return stencil.groups().first(); }); } - + var edges = stencils.findAll(function(stencil) { return stencil.type() == "edge"; }); result = result.concat(edges); - + return result; - + } else { if(sortByGroup) { return this._availableStencils.values().sortBy(function(stencil) { @@ -8297,49 +8297,49 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } } }, - + nodes: function(){ return this._availableStencils.values().findAll(function(stencil){ return (stencil.type() === 'node') }); }, - + edges: function(){ return this._availableStencils.values().findAll(function(stencil){ return (stencil.type() === 'edge') }); }, - + stencil: function(id){ return this._stencils[id]; }, - + title: function(){ return ORYX.Core.StencilSet.getTranslation(this._jsonObject, "title"); }, - + description: function(){ return ORYX.Core.StencilSet.getTranslation(this._jsonObject, "description"); }, - + namespace: function(){ return this._jsonObject ? this._jsonObject.namespace : null; }, - + jsonRules: function(){ return this._jsonObject ? this._jsonObject.rules : null; }, - + source: function(){ return this._source; }, - + extensions: function() { return this._extensions; }, - + addExtension: function(url) { - + new Ajax.Request(url, { method: 'GET', asynchronous: false, @@ -8352,10 +8352,10 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ onException: (function(transport) { ORYX.Log.debug("Loading stencil set extension file failed. The request returned an error." + transport); }).bind(this) - + }); }, - + addExtensionDirectly: function(str){ try { @@ -8363,28 +8363,28 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ if(!(jsonExtension["extends"].endsWith("#"))) jsonExtension["extends"] += "#"; - + if(jsonExtension["extends"] == this.namespace()) { this._extensions[jsonExtension.namespace] = jsonExtension; - + var defaultPosition = this._stencils.keys().size(); //load new stencils if(jsonExtension.stencils) { $A(jsonExtension.stencils).each(function(stencil) { defaultPosition++; - var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this, undefined, defaultPosition); + var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this, undefined, defaultPosition); this._stencils[oStencil.id()] = oStencil; this._availableStencils[oStencil.id()] = oStencil; }.bind(this)); } - + //load additional properties if (jsonExtension.properties) { var stencils = this._stencils.values(); - + stencils.each(function(stencil){ var roles = stencil.roles(); - + jsonExtension.properties.each(function(prop){ prop.roles.any(function(role){ role = jsonExtension["extends"] + role; @@ -8392,16 +8392,16 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ prop.properties.each(function(property){ stencil.addProperty(property, jsonExtension.namespace); }); - + return true; } - else + else return false; }) }) }.bind(this)); } - + //remove stencil properties if(jsonExtension.removeproperties) { jsonExtension.removeproperties.each(function(remprop) { @@ -8413,7 +8413,7 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } }.bind(this)); } - + //remove stencils if(jsonExtension.removestencils) { $A(jsonExtension.removestencils).each(function(remstencil) { @@ -8423,29 +8423,29 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } } catch (e) { ORYX.Log.debug("StencilSet.addExtension: Something went wrong when initialising the stencil set extension. " + e); - } + } }, - + removeExtension: function(namespace) { var jsonExtension = this._extensions[namespace]; if(jsonExtension) { - + //unload extension's stencils if(jsonExtension.stencils) { $A(jsonExtension.stencils).each(function(stencil) { - var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this); + var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this); delete this._stencils[oStencil.id()]; // maybe not ?? delete this._availableStencils[oStencil.id()]; }.bind(this)); } - + //unload extension's properties if (jsonExtension.properties) { var stencils = this._stencils.values(); - + stencils.each(function(stencil){ var roles = stencil.roles(); - + jsonExtension.properties.each(function(prop){ prop.roles.any(function(role){ role = jsonExtension["extends"] + role; @@ -8453,16 +8453,16 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ prop.properties.each(function(property){ stencil.removeProperty(property.id); }); - + return true; } - else + else return false; }) }) }.bind(this)); } - + //restore removed stencil properties if(jsonExtension.removeproperties) { jsonExtension.removeproperties.each(function(remprop) { @@ -8476,7 +8476,7 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } }.bind(this)); } - + //restore removed stencils if(jsonExtension.removestencils) { $A(jsonExtension.removestencils).each(function(remstencil) { @@ -8487,44 +8487,44 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ } delete this._extensions[namespace]; }, - + __handleStencilset: function(response){ - + try { // using eval instead of prototype's parsing, // since there are functions in this JSON. eval("this._jsonObject =" + response.responseText); - } + } catch (e) { throw "Stenciset corrupt: " + e; } - + // assert it was parsed. if (!this._jsonObject) { throw "Error evaluating stencilset. It may be corrupt."; } - + with (this._jsonObject) { - + // assert there is a namespace. - if (!namespace || namespace === "") + if (!namespace || namespace === "") throw "Namespace definition missing in stencilset."; - - if (!(stencils instanceof Array)) + + if (!(stencils instanceof Array)) throw "Stencilset corrupt."; - + // assert namespace ends with '#'. - if (!namespace.endsWith("#")) + if (!namespace.endsWith("#")) namespace = namespace + "#"; - + // assert title and description are strings. - if (!title) + if (!title) title = ""; - if (!description) + if (!description) description = ""; } }, - + /** * This method is called when the HTTP request to get the requested stencil * set succeeds. The response is supposed to be a JSON representation @@ -8533,37 +8533,37 @@ ORYX.Core.StencilSet.StencilSet = Clazz.extend({ * stencil set specification. */ _init: function(response){ - + // init and check consistency. this.__handleStencilset(response); - + var pps = new Hash(); - + // init property packages if(this._jsonObject.propertyPackages) { $A(this._jsonObject.propertyPackages).each((function(pp) { pps[pp.name] = pp.properties; }).bind(this)); } - + var defaultPosition = 0; - + // init each stencil $A(this._jsonObject.stencils).each((function(stencil){ defaultPosition++; - + // instantiate normally. - var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this, pps, defaultPosition); + var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this, pps, defaultPosition); this._stencils[oStencil.id()] = oStencil; this._availableStencils[oStencil.id()] = oStencil; - + }).bind(this)); }, - + _cancelInit: function(response){ this.errornous = true; }, - + toString: function(){ return "StencilSet " + this.title() + " (" + this.namespace() + ")"; } @@ -8596,7 +8596,7 @@ if(!ORYX.Core.StencilSet) {ORYX.Core.StencilSet = {};} ORYX.Core.StencilSet._stencilSetsByNamespace = new Hash(); //storage for stencil sets by url -ORYX.Core.StencilSet._stencilSetsByUrl = new Hash(); +ORYX.Core.StencilSet._stencilSetsByUrl = new Hash(); //storage for stencil set namespaces by editor instances ORYX.Core.StencilSet._StencilSetNSByEditorInstance = new Hash(); @@ -8605,9 +8605,9 @@ ORYX.Core.StencilSet._StencilSetNSByEditorInstance = new Hash(); ORYX.Core.StencilSet._rulesByEditorInstance = new Hash(); /** - * + * * @param {String} editorId - * + * * @return {Hash} Returns a hash map with all stencil sets that are loaded by * the editor with the editorId. */ @@ -8624,12 +8624,12 @@ ORYX.Core.StencilSet.stencilSets = function(editorId) { }; /** - * + * * @param {String} namespace - * + * * @return {ORYX.Core.StencilSet.StencilSet} Returns the stencil set with the specified * namespace. - * + * * The method can handle namespace strings like * http://www.example.org/stencilset * http://www.example.org/stencilset# @@ -8647,11 +8647,11 @@ ORYX.Core.StencilSet.stencilSet = function(namespace) { }; /** - * + * * @param {String} id - * + * * @return {ORYX.Core.StencilSet.Stencil} Returns the stencil specified by the id. - * + * * The id must be unique and contains the namespace of the stencil's stencil set. * e.g. http://www.example.org/stencilset#ANode */ @@ -8668,9 +8668,9 @@ ORYX.Core.StencilSet.stencil = function(id) { }; /** - * + * * @param {String} editorId - * + * * @return {ORYX.Core.StencilSet.Rules} Returns the rules object for the editor * specified by its editor id. */ @@ -8682,33 +8682,33 @@ ORYX.Core.StencilSet.rules = function(editorId) { }; /** - * + * * @param {String} url * @param {String} editorId - * + * * Loads a stencil set from url, if it is not already loaded. - * It also stores which editor instance loads the stencil set and + * It also stores which editor instance loads the stencil set and * initializes the Rules object for the editor instance. */ ORYX.Core.StencilSet.loadStencilSet = function(url, modelMetaData, editorId) { - + // Alfresco: disable cache, because stencil sets are now flexible - + //var stencilSet = ORYX.Core.StencilSet._stencilSetsByUrl[url]; //if(!stencilSet) { //load stencil set stencilSet = new ORYX.Core.StencilSet.StencilSet(url, modelMetaData, editorId); - + //store stencil set ORYX.Core.StencilSet._stencilSetsByNamespace[stencilSet.namespace()] = stencilSet; - + //store stencil set by url ORYX.Core.StencilSet._stencilSetsByUrl[url] = stencilSet; //} - + var namespace = stencilSet.namespace(); - + //store which editorInstance loads the stencil set if(ORYX.Core.StencilSet._StencilSetNSByEditorInstance[editorId]) { ORYX.Core.StencilSet._StencilSetNSByEditorInstance[editorId].push(namespace); @@ -8732,17 +8732,17 @@ ORYX.Core.StencilSet.loadStencilSet = function(url, modelMetaData, editorId) { */ ORYX.Core.StencilSet.getTranslation = function(jsonObject, name) { var lang = ORYX.I18N.Language.toLowerCase(); - + var result = jsonObject[name + "_" + lang]; - + if(result) return result; - + result = jsonObject[name + "_" + lang.substr(0, 2)]; - + if(result) return result; - + return jsonObject[name]; }; /* @@ -8773,16 +8773,16 @@ ORYX.Core.Command = Clazz.extend({ construct: function() { }, - + execute: function(){ throw "Command.execute() has to be implemented!" }, - + rollback: function(){ throw "Command.rollback() has to be implemented!" } - - + + });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * License rights for this program may be obtained from Alfresco Software, Ltd. @@ -8816,7 +8816,7 @@ ORYX.Core.Bounds = { this.suspendChange = false; this.changedWhileSuspend = false; }, - + /** * Calls all registered callbacks. */ @@ -8829,17 +8829,17 @@ ORYX.Core.Bounds = { } else this.changedWhileSuspend = true; }, - + /** * Registers a callback that is called, if the bounds changes. * @param callback {Function} The callback function. */ registerCallback: function(callback) { if(!this._changedCallbacks.member(callback)) { - this._changedCallbacks.push(callback); + this._changedCallbacks.push(callback); } }, - + /** * Unregisters a callback. * @param callback {Function} The callback function. @@ -8847,18 +8847,18 @@ ORYX.Core.Bounds = { unregisterCallback: function(callback) { this._changedCallbacks = this._changedCallbacks.without(callback); }, - + /** * Sets position and size of the shape dependent of four coordinates * (set(ax, ay, bx, by);), two points (set({x: ax, y: ay}, {x: bx, y: by});) * or one bound (set({a: {x: ax, y: ay}, b: {x: bx, y: by}});). */ set: function() { - + var changed = false; - + switch (arguments.length) { - + case 1: if(this.a.x !== arguments[0].a.x) { changed = true; @@ -8877,7 +8877,7 @@ ORYX.Core.Bounds = { this.b.y = arguments[0].b.y; } break; - + case 2: var ax = Math.min(arguments[0].x, arguments[1].x); var ay = Math.min(arguments[0].y, arguments[1].y); @@ -8900,7 +8900,7 @@ ORYX.Core.Bounds = { this.b.y = by; } break; - + case 4: var ax = Math.min(arguments[0], arguments[2]); var ay = Math.min(arguments[1], arguments[3]); @@ -8924,12 +8924,12 @@ ORYX.Core.Bounds = { } break; } - + if(changed) { this._changed(true); } }, - + /** * Moves the bounds so that the point p will be the new upper left corner. * @param {Point} p @@ -8938,7 +8938,7 @@ ORYX.Core.Bounds = { * @param {Number} y */ moveTo: function() { - + var currentPosition = this.upperLeft(); switch (arguments.length) { case 1: @@ -8956,20 +8956,20 @@ ORYX.Core.Bounds = { default: //TODO error } - + }, - + /** * Moves the bounds relatively by p. * @param {Point} p * or * @param {Number} x * @param {Number} y - * + * */ moveBy: function() { var changed = false; - + switch (arguments.length) { case 1: var p = arguments[0]; @@ -8980,7 +8980,7 @@ ORYX.Core.Bounds = { this.a.y += p.y; this.b.y += p.y; } - break; + break; case 2: var x = arguments[0]; var y = arguments[1]; @@ -8991,54 +8991,54 @@ ORYX.Core.Bounds = { this.a.y += y; this.b.y += y; } - break; + break; default: //TODO error } - + if(changed) { this._changed(); } }, - + /*** * Includes the bounds b into the current bounds. * @param {Bounds} b */ include: function(b) { - + if( (this.a.x === undefined) && (this.a.y === undefined) && (this.b.x === undefined) && (this.b.y === undefined)) { return b; }; - + var cx = Math.min(this.a.x,b.a.x); var cy = Math.min(this.a.y,b.a.y); - + var dx = Math.max(this.b.x,b.b.x); var dy = Math.max(this.b.y,b.b.y); - + this.set(cx, cy, dx, dy); }, - + /** * Relatively extends the bounds by p. * @param {Point} p */ extend: function(p) { - + if(p.x !== 0 || p.y !== 0) { // this is over cross for the case that a and b have same coordinates. //((this.a.x > this.b.x) ? this.a : this.b).x += p.x; //((this.b.y > this.a.y) ? this.b : this.a).y += p.y; this.b.x += p.x; this.b.y += p.y; - + this._changed(true); } }, - + /** * Widens the scope of the bounds by x. * @param {Number} x @@ -9054,7 +9054,7 @@ ORYX.Core.Bounds = { } } }, - + /** * Returns the upper left corner's point regardless of the * bound delimiter points. @@ -9065,7 +9065,7 @@ ORYX.Core.Bounds = { result.y = this.a.y; return result; }, - + /** * Returns the lower Right left corner's point regardless of the * bound delimiter points. @@ -9076,78 +9076,78 @@ ORYX.Core.Bounds = { result.y = this.b.y; return result; }, - + /** * @return {Number} Width of bounds. */ width: function() { return this.b.x - this.a.x; }, - + /** * @return {Number} Height of bounds. */ height: function() { return this.b.y - this.a.y; }, - + /** * @return {Point} The center point of this bounds. */ center: function() { var center = {}; - center.x =(this.a.x + this.b.x)/2.0; + center.x =(this.a.x + this.b.x)/2.0; center.y =(this.a.y + this.b.y)/2.0; return center; }, - + /** * @return {Point} The center point of this bounds relative to upperLeft. */ midPoint: function() { - + var midpoint = {}; - midpoint.x = (this.b.x - this.a.x)/2.0; + midpoint.x = (this.b.x - this.a.x)/2.0; midpoint.y = (this.b.y - this.a.y)/2.0; return midpoint; }, - + /** * Moves the center point of this bounds to the new position. - * @param p {Point} + * @param p {Point} * or * @param x {Number} * @param y {Number} */ centerMoveTo: function() { var currentPosition = this.center(); - + switch (arguments.length) { - + case 1: this.moveBy(arguments[0].x - currentPosition.x, arguments[0].y - currentPosition.y); break; - + case 2: this.moveBy(arguments[0] - currentPosition.x, arguments[1] - currentPosition.y); break; } }, - + isIncluded: function(point, offset) { - + var pointX, pointY, offset; - // Get the the two Points + // Get the the two Points switch(arguments.length) { case 1: pointX = arguments[0].x; pointY = arguments[0].y; offset = 0; - + break; case 2: if(arguments[0].x && arguments[0].y) { @@ -9168,39 +9168,39 @@ ORYX.Core.Bounds = { default: throw "isIncluded needs one, two or three arguments"; } - + var ul = this.upperLeft(); var lr = this.lowerRight(); - - if(pointX >= ul.x - offset - && pointX <= lr.x + offset && pointY >= ul.y - offset + + if(pointX >= ul.x - offset + && pointX <= lr.x + offset && pointY >= ul.y - offset && pointY <= lr.y + offset) return true; - else + else return false; }, - + /** * @return {Bounds} A copy of this bounds. */ clone: function() { - + //Returns a new bounds object without the callback // references of the original bounds return new ORYX.Core.Bounds(this); }, - + toString: function() { - + return "( "+this.a.x+" | "+this.a.y+" )/( "+this.b.x+" | "+this.b.y+" )"; }, - + serializeForERDF: function() { return this.a.x+","+this.a.y+","+this.b.x+","+this.b.y; } }; - + ORYX.Core.Bounds = Clazz.extend(ORYX.Core.Bounds);/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * License rights for this program may be obtained from Alfresco Software, Ltd. @@ -9227,30 +9227,30 @@ ORYX.Core.UIObject = { /** * Constructor of the UIObject class. */ - construct: function(options) { - + construct: function(options) { + this.isChanged = true; //Flag, if UIObject has been changed since last update. this.isResized = true; this.isVisible = true; //Flag, if UIObject's display attribute is set to 'inherit' or 'none' this.isSelectable = false; //Flag, if UIObject is selectable. this.isResizable = false; //Flag, if UIObject is resizable. this.isMovable = false; //Flag, if UIObject is movable. - + this.id = ORYX.Editor.provideId(); //get unique id this.parent = undefined; //parent is defined, if this object is added to another uiObject. this.node = undefined; //this is a reference to the SVG representation, either locally or in DOM. this.children = []; //array for all add uiObjects - + this.bounds = new ORYX.Core.Bounds(); //bounds with undefined values this._changedCallback = this._changed.bind(this); //callback reference for calling _changed this.bounds.registerCallback(this._changedCallback); //set callback in bounds - + if(options && options.eventHandlerCallback) { this.eventHandlerCallback = options.eventHandlerCallback; } }, - + /** * Sets isChanged flag to true. Callback for the bounds object. */ @@ -9259,7 +9259,7 @@ ORYX.Core.UIObject = { if(this.bounds == bounds) this.isResized = isResized || this.isResized; }, - + /** * If something changed, this method calls the refresh method that must be implemented by subclasses. */ @@ -9267,28 +9267,28 @@ ORYX.Core.UIObject = { if(this.isChanged) { this.refresh(); this.isChanged = false; - + //call update of all children this.children.each(function(value) { value.update(); }); } }, - + /** * Is called in update method, if isChanged is set to true. Sub classes should call the super class method. */ refresh: function() { - + }, - + /** * @return {Array} Array of all child UIObjects. */ getChildren: function() { return this.children.clone(); }, - + /** * @return {Array} Array of all parent UIObjects. */ @@ -9301,11 +9301,11 @@ ORYX.Core.UIObject = { } return parents; }, - + /** * Returns TRUE if the given parent is one of the UIObjects parents or the UIObject themselves, otherwise FALSE. * @param {UIObject} parent - * @return {Boolean} + * @return {Boolean} */ isParent: function(parent){ var cparent = this; @@ -9317,19 +9317,19 @@ ORYX.Core.UIObject = { } return false; }, - + /** * @return {String} Id of this UIObject */ getId: function() { return this.id; }, - + /** * Method for accessing child uiObjects by id. * @param {String} id * @param {Boolean} deep - * + * * @return {UIObject} If found, it returns the UIObject with id. */ getChildById: function(id, deep) { @@ -9346,7 +9346,7 @@ ORYX.Core.UIObject = { } }); }, - + /** * Adds an UIObject to this UIObject and sets the parent of the * added UIObject. It is also added to the SVG representation of this @@ -9360,16 +9360,16 @@ ORYX.Core.UIObject = { if(uiObject.parent) { uiObject.remove(uiObject); } - + //add uiObject to children this.children.push(uiObject); - + //set parent reference uiObject.parent = this; - + //add uiObject.node to this.node uiObject.node = this.node.appendChild(uiObject.node); - + //register callback to get informed, if child is changed uiObject.bounds.registerCallback(this._changedCallback); @@ -9378,7 +9378,7 @@ ORYX.Core.UIObject = { ORYX.Log.info("add: ORYX.Core.UIObject is already a child of this object."); } }, - + /** * Removes UIObject from this UIObject. The SVG representation will also * be removed from this UIObject's SVG representation. @@ -9389,21 +9389,21 @@ ORYX.Core.UIObject = { if (this.children.member(uiObject)) { //remove uiObject from children this.children = this._uiObjects.without(uiObject); - + //delete parent reference of uiObject uiObject.parent = undefined; - + //delete uiObject.node from this.node uiObject.node = this.node.removeChild(uiObject.node); - + //unregister callback to get informed, if child is changed uiObject.bounds.unregisterCallback(this._changedCallback); } else { ORYX.Log.info("remove: ORYX.Core.UIObject is not a child of this object."); } - + }, - + /** * Calculates absolute bounds of this UIObject. */ @@ -9441,12 +9441,12 @@ ORYX.Core.UIObject = { */ absoluteCenterXY: function() { if(this.parent) { - var pXY = this.parent.absoluteXY(); + var pXY = this.parent.absoluteXY(); var result = {}; result.x = pXY.x + this.bounds.center().x; result.y = pXY.y + this.bounds.center().y; return result; - + } else { var result = {}; result.x = this.bounds.center().x; @@ -9454,7 +9454,7 @@ ORYX.Core.UIObject = { return result; } }, - + /** * Hides this UIObject and all its children. */ @@ -9462,10 +9462,10 @@ ORYX.Core.UIObject = { this.node.setAttributeNS(null, 'display', 'none'); this.isVisible = false; this.children.each(function(uiObj) { - uiObj.hide(); + uiObj.hide(); }); }, - + /** * Enables visibility of this UIObject and all its children. */ @@ -9473,28 +9473,28 @@ ORYX.Core.UIObject = { this.node.setAttributeNS(null, 'display', 'inherit'); this.isVisible = true; this.children.each(function(uiObj) { - uiObj.show(); - }); + uiObj.show(); + }); }, - + addEventHandlers: function(node) { - + node.addEventListener(ORYX.CONFIG.EVENT_MOUSEDOWN, this._delegateEvent.bind(this), false); - node.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this._delegateEvent.bind(this), false); + node.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this._delegateEvent.bind(this), false); node.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this._delegateEvent.bind(this), false); node.addEventListener(ORYX.CONFIG.EVENT_MOUSEOVER, this._delegateEvent.bind(this), false); node.addEventListener(ORYX.CONFIG.EVENT_MOUSEOUT, this._delegateEvent.bind(this), false); node.addEventListener('click', this._delegateEvent.bind(this), false); node.addEventListener(ORYX.CONFIG.EVENT_DBLCLICK, this._delegateEvent.bind(this), false); - + }, - + _delegateEvent: function(event) { if(this.eventHandlerCallback) { this.eventHandlerCallback(event, this); } }, - + toString: function() { return "UIObject " + this.id } }; ORYX.Core.UIObject = Clazz.extend(ORYX.Core.UIObject);/* @@ -9526,11 +9526,11 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( * Constructor */ construct: function(options, stencil, facade) { - + arguments.callee.$.construct.apply(this, arguments); - + this.resourceId = ORYX.Editor.provideId(); //Id of resource in DOM - + // stencil reference this._stencil = stencil; // if the stencil defines a super stencil that should be used for its instances, set it. @@ -9540,23 +9540,23 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( stencilSet = this._stencil.stencilSet(); this._stencil = stencilSet.stencil(superStencilId); } - + //Hash map for all properties. Only stores the values of the properties. this.properties = new Hash(); this.propertiesChanged = new Hash(); - // List of properties which are not included in the stencilset, + // List of properties which are not included in the stencilset, // but which gets (de)serialized this.hiddenProperties = new Hash(); - - + + //Initialization of property map and initial value. this._stencil.properties().each((function(property) { var key = property.prefix() + "-" + property.id(); this.properties[key] = property.value(); this.propertiesChanged[key] = true; }).bind(this)); - + // if super stencil was defined, also regard stencil's properties: if (stencil._jsonStencil.superId) { stencil.properties().each((function(property) { @@ -9571,8 +9571,8 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( //window.setTimeout( function(){ this._delegateEvent({ - type : ORYX.CONFIG.EVENT_PROPERTY_CHANGED, - name : key, + type : ORYX.CONFIG.EVENT_PROPERTY_CHANGED, + name : key, value : value, oldValue: oldValue }); @@ -9587,28 +9587,28 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( layout: function() { }, - + /** * Returns the stencil object specifiing the type of the shape. */ getStencil: function() { return this._stencil; }, - + /** - * + * * @param {Object} resourceId */ getChildShapeByResourceId: function(resourceId) { resourceId = ERDF.__stripHashes(resourceId); - + return this.getChildShapes(true).find(function(shape) { return shape.resourceId == resourceId }); }, /** - * + * * @param {Object} deep * @param {Object} iterator */ @@ -9623,13 +9623,13 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( result.push(uiObject); if(deep) { result = result.concat(uiObject.getChildShapes(deep, iterator)); - } + } } }); return result; }, - + /** * @param {Object} shape * @return {boolean} true if any of shape's childs is given shape @@ -9639,9 +9639,9 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( return (child === shape) || child.hasChildShape(shape); }); }, - + /** - * + * * @param {Object} deep * @param {Object} iterator */ @@ -9664,9 +9664,9 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( return result; }, - + /** - * + * * @param {Object} deep * @param {Object} iterator */ @@ -9689,7 +9689,7 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( return result; }, - + /** * Returns a sorted array of ORYX.Core.Node objects. * Ordered in z Order, the last object has the highest z Order. @@ -9715,15 +9715,15 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( var result = []; result.push(this); - //check, if one child is at that position - - + //check, if one child is at that position + + var childNodes = this.getChildNodes(); var childEdges = this.getChildEdges(); - + [childNodes, childEdges].each(function(ne){ var nodesAtPosition = new Hash(); - + ne.each(function(node) { if(!node.isVisible){ return } var candidates = node.getAbstractShapesAtPosition( x , y ); @@ -9733,21 +9733,21 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( nodesAtPosition[zOrderIndex] = candidates; } }); - + nodesAtPosition.keys().sort().each(function(key) { result = result.concat(nodesAtPosition[key]); }); }); - + return result; - + } else { return []; } }, - + /** - * + * * @param key {String} Must be 'prefix-id' of property * @param value {Object} Can be of type String or Number according to property type. */ @@ -9757,27 +9757,27 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( this.properties[key] = value; this.propertiesChanged[key] = true; this._changed(); - + // Raise an event, to show that the property has changed //window.setTimeout( function(){ if (!this._isInSetProperty) { this._isInSetProperty = true; - + this._delegateEvent({ - type : ORYX.CONFIG.EVENT_PROPERTY_CHANGED, + type : ORYX.CONFIG.EVENT_PROPERTY_CHANGED, elements : [this], - name : key, + name : key, value : value, oldValue: oldValue }); - + delete this._isInSetProperty; } //}.bind(this), 10) } }, - + /** * Returns TRUE if one of the properties is flagged as dirty * @return {boolean} @@ -9787,7 +9787,7 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( }, /** - * + * * @param {String} Must be 'prefix-id' of property * @param {Object} Can be of type String or Number according to property type. */ @@ -9809,9 +9809,9 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( isPointIncluded: function(pointX, pointY, absoluteBounds) { var absBounds = absoluteBounds ? absoluteBounds : this.absoluteBounds(); return absBounds.isIncluded(pointX, pointY); - + }, - + /** * Get the serialized object * return Array with hash-entrees (prefix, name, value) @@ -9821,58 +9821,58 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( */ serialize: function() { var serializedObject = []; - + // Add the type - serializedObject.push({name: 'type', prefix:'oryx', value: this.getStencil().id(), type: 'literal'}); - + serializedObject.push({name: 'type', prefix:'oryx', value: this.getStencil().id(), type: 'literal'}); + // Add hidden properties this.hiddenProperties.each(function(prop){ serializedObject.push({name: prop.key.replace("oryx-", ""), prefix: "oryx", value: prop.value, type: 'literal'}); }.bind(this)); - + // Add all properties this.getStencil().properties().each((function(property){ - + var prefix = property.prefix(); // Get prefix var name = property.id(); // Get name - + //if(typeof this.properties[prefix+'-'+name] == 'boolean' || this.properties[prefix+'-'+name] != "") serializedObject.push({name: name, prefix: prefix, value: this.properties[prefix+'-'+name], type: 'literal'}); }).bind(this)); - + return serializedObject; }, - - + + deserialize: function(serialize){ // Search in Serialize var initializedDocker = 0; - + // Sort properties so that the hidden properties are first in the list serialize = serialize.sort(function(a,b){ a = Number(this.properties.keys().member(a.prefix+"-"+a.name)); b = Number(this.properties.keys().member(b.prefix+"-"+b.name)); return a > b ? 1 : (a < b ? -1 : 0) }.bind(this)); - + serialize.each((function(obj){ - + var name = obj.name; var prefix = obj.prefix; var value = obj.value; - + // Complex properties can be real json objects, encode them to a string if (Object.prototype.toString.call(value) === "Object") value = JSON.stringify(value); switch(prefix + "-" + name){ - case 'raziel-parent': + case 'raziel-parent': // Set parent if(!this.parent) {break}; - + // Set outgoing Shape var parent = this.getCanvas().getChildShapeByResourceId(value); if(parent) { parent.add(this); } - - break; + + break; default: // If list, eval as an array var prop = this.getStencil().property(prefix+"-"+name); @@ -9881,20 +9881,20 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( value = "[\""+value.strip()+"\"]"; value = ((value||"").strip()||"[]").evalJSON(); } - + // Set property if(this.properties.keys().member(prefix+"-"+name)) { this.setProperty(prefix+"-"+name, value); } else if(!(name === "bounds"||name === "parent"||name === "target"||name === "dockers"||name === "docker"||name === "outgoing"||name === "incoming")) { this.setHiddenProperty(prefix+"-"+name, value); } - + } }).bind(this)); }, - + toString: function() { return "ORYX.Core.AbstractShape " + this.id }, - + /** * Converts the shape to a JSON representation. * @return {Object} A JSON object with included ORYX.Core.AbstractShape.JSONHelper and getShape() method. @@ -9905,26 +9905,26 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( properties: jQuery.extend({}, this.properties, this.hiddenProperties).inject({}, function(props, prop){ var key = prop[0]; var value = prop[1]; - + //If complex property, value should be a json object if ( this.getStencil().property(key) - && this.getStencil().property(key).type() === ORYX.CONFIG.TYPE_COMPLEX + && this.getStencil().property(key).type() === ORYX.CONFIG.TYPE_COMPLEX && Object.prototype.toString.call(value) === "String"){ - + try {value = JSON.parse(value);} catch(error){} //try {value = JSON.parse(value);} catch(error){} - + // Parse date } else if (value instanceof Date&&this.getStencil().property(key)){ try { value = value.format(this.getStencil().property(key).dateFormat()); } catch(e){} } - + //Takes "my_property" instead of "oryx-my_property" as key key = key.replace(/^[\w_]+-/, ""); props[key] = value; - + return props; }.bind(this)), stencil: { @@ -9934,7 +9934,7 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( return shape.toJSON(); }) }; - + if(this.getOutgoingShapes){ json.outgoing = this.getOutgoingShapes().map(function(shape){ return { @@ -9942,14 +9942,14 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( }; }); } - + if(this.bounds){ - json.bounds = { - lowerRight: this.bounds.lowerRight(), - upperLeft: this.bounds.upperLeft() + json.bounds = { + lowerRight: this.bounds.lowerRight(), + upperLeft: this.bounds.upperLeft() }; } - + if(this.dockers){ json.dockers = this.dockers.map(function(docker){ var d = docker.getDockedShape() && docker.referencePoint ? docker.referencePoint : docker.bounds.center(); @@ -9957,19 +9957,19 @@ ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend( return d; }); } - + jQuery.extend(json, ORYX.Core.AbstractShape.JSONHelper); - + // do not pollute the json attributes (for serialization), so put the corresponding // shape is encapsulated in a method json.getShape = function(){ return this; }.bind(this); - + return json; } }); - + /** * @namespace Collection of methods which can be used on a shape json object (ORYX.Core.AbstractShape#toJSON()). * @example @@ -9982,7 +9982,7 @@ ORYX.Core.AbstractShape.JSONHelper = { * @param {boolean} [deep=false] Iterate recursively (childShapes of childShapes) * @param {boolean} [modify=false] If true, the result of the iterator function is taken as new shape, return false to delete it. This enables modifying the object while iterating through the child shapes. * @example - * // Increases the lowerRight x value of each direct child shape by one. + * // Increases the lowerRight x value of each direct child shape by one. * myShapeAsJson.eachChild(function(shape, parentShape){ * shape.bounds.lowerRight.x = shape.bounds.lowerRight.x + 1; * return shape; @@ -9990,28 +9990,28 @@ ORYX.Core.AbstractShape.JSONHelper = { */ eachChild: function(iterator, deep, modify){ if(!this.childShapes) return; - + var newChildShapes = []; //needed if modify = true - + this.childShapes.each(function(shape){ if (!(shape.eachChild instanceof Function)){ jQuery.extend(shape, ORYX.Core.AbstractShape.JSONHelper); } var res = iterator(shape, this); if(res) newChildShapes.push(res); //if false is returned, and modify = true, current shape is deleted. - + if(deep) shape.eachChild(iterator, deep, modify); }.bind(this)); - + if(modify) this.childShapes = newChildShapes; }, - + getShape: function(){ return null; }, getChildShapes: function(deep){ var allShapes = this.childShapes; - + if(deep){ this.eachChild(function(shape){ if (!(shape.getChildShapes instanceof Function)){ @@ -10020,10 +10020,10 @@ ORYX.Core.AbstractShape.JSONHelper = { allShapes = allShapes.concat(shape.getChildShapes(deep)); }, true); } - + return allShapes; }, - + /** * @return {String} Serialized JSON object */ @@ -10072,29 +10072,29 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ arguments.callee.$.construct.apply(this, arguments); if(!(options && options.width && options.height)) { - + ORYX.Log.fatal("Canvas is missing mandatory parameters options.width and options.height."); return; } - this.facade = facade; + this.facade = facade; //TODO: set document resource id this.resourceId = options.id; this.nodes = []; - + this.edges = []; - + // Row highlighting states this.colHighlightState = 0; - - this.colHighlightEnabled = false; - + + this.colHighlightEnabled = false; + //init svg document this.rootNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", options.parentNode, ['svg', {id: this.id, width: options.width, height: options.height}, ['defs', {}] ]); - + this.rootNode.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); this.rootNode.setAttribute("xmlns:svg", "http://www.w3.org/2000/svg"); @@ -10104,14 +10104,14 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ // Additional SVG-node BELOW the stencils to allow underlays (if that is even a word) by plugins this.underlayNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.rootNode, ['svg', {id: "underlay-container"}]); - + // Create 2 svg-elements in the svg-container this.columnHightlight1 = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.underlayNode, ['rect', {x: 0, width: ORYX.CONFIG.FORM_ROW_WIDTH + 35, height: "100%", style: "fill: #fff6d5", visibility: "hidden"}]); - + this.columnHightlight2 = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.underlayNode, ['rect', {x: ORYX.CONFIG.FORM_ROW_WIDTH + 35, width: ORYX.CONFIG.FORM_ROW_WIDTH + 25, height: "100%", style: "fill: #fff6d5", visibility: "hidden"}]); - + this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.rootNode, ['g', {}, ['g', {"class": "stencils"}, @@ -10121,7 +10121,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ ], ['g', {"class":"svgcontainer"}] ]); - + /* var off = 2 * ORYX.CONFIG.GRID_DISTANCE; var size = 3; @@ -10129,11 +10129,11 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ for(var i = 0; i <= options.width; i += off) for(var j = 0; j <= options.height; j += off) d = d + "M" + (i - size) + " " + j + " l" + (2*size) + " 0 m" + (-size) + " " + (-size) + " l0 " + (2*size) + " m0" + (-size) + " "; - + ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node.firstChild.firstChild, ['path', {d:d , stroke:'#000000', 'stroke-width':'0.15px'},]); */ - + //Global definition of default font for shapes //Definitions in the SVG definition of a stencil will overwrite these settings for // that stencil. @@ -10148,7 +10148,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ this.node.setAttributeNS(null, 'font-family', 'Verdana'); this.node.setAttributeNS(null, 'font-size', ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT); }*/ - + this.node.setAttributeNS(null, 'stroke', 'none'); this.node.setAttributeNS(null, 'font-family', 'Verdana, sans-serif'); this.node.setAttributeNS(null, 'font-size-adjust', 'none'); @@ -10156,34 +10156,34 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ this.node.setAttributeNS(null, 'font-variant', 'normal'); this.node.setAttributeNS(null, 'font-weight', 'normal'); this.node.setAttributeNS(null, 'line-heigth', 'normal'); - + this.node.setAttributeNS(null, 'font-size', ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT); - + this.bounds.set(0,0,options.width, options.height); - + this.addEventHandlers(this.rootNode.parentNode); - + //disable context menu this.rootNode.oncontextmenu = function() {return false;}; }, - + focus: function(){ - + try { // Get a href - if (!this.focusEl) + if (!this.focusEl) { this.focusEl = jQuery('body').append(jQuery('')); this.focusEl.swallowEvent("click", true); } - + // Focus it this.focusEl.focus.defer(1, this.focusEl); this.focusEl.blur.defer(3, this.focusEl); - + } catch(e){} }, - + setHightlightState: function(state) { if(this.colHighlightEnabled && this.colHighlightState != state) { if(state == 0) { @@ -10202,7 +10202,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ this.colHighlightState = state; } }, - + setHightlightStateBasedOnX : function(x) { if(x > ORYX.CONFIG.FORM_ROW_WIDTH + 30) { this.setHightlightState(2); @@ -10210,42 +10210,42 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ this.setHightlightState(1); } }, - + update: function() { - + this.nodes.each(function(node) { this._traverseForUpdate(node); }.bind(this)); - + // call stencil's layout callback // (needed for row layouting of xforms) //this.getStencil().layout(this); - + var layoutEvents = this.getStencil().layout(); - + if(layoutEvents) { layoutEvents.each(function(event) { - + // setup additional attributes event.shape = this; event.forceExecution = true; event.target = this.rootNode; - + // do layouting - + this._delegateEvent(event); }.bind(this)) } - + this.nodes.invoke("_update"); - + this.edges.invoke("_update", true); - + /*this.children.each(function(child) { child._update(); });*/ }, - + _traverseForUpdate: function(shape) { var childRet = shape.isChanged; shape.getChildNodes(false, function(child) { @@ -10253,7 +10253,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ childRet = true; } }.bind(this)); - + if(childRet) { shape.layout(); return true; @@ -10261,15 +10261,15 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ return false; } }, - + layout: function() { - - - + + + }, - + /** - * + * * @param {Object} deep * @param {Object} iterator */ @@ -10283,18 +10283,18 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ iterator(uiObject); } result.push(uiObject); - + if(deep && uiObject instanceof ORYX.Core.Shape) { result = result.concat(uiObject.getChildNodes(deep, iterator)); } }); - + return result; } }, - + /** - * buggy crap! use base class impl instead! + * buggy crap! use base class impl instead! * @param {Object} iterator */ /* getChildEdges: function(iterator) { @@ -10303,10 +10303,10 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ iterator(edge); }); } - + return this.edges.clone(); }, -*/ +*/ /** * Overrides the UIObject.add method. Adds uiObject to the correct sub node. * @param {UIObject} uiObject @@ -10345,11 +10345,11 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ } uiObject.bounds.registerCallback(this._changedCallback); - + if(this.eventHandlerCallback && silent !== true) this.eventHandlerCallback({type:ORYX.CONFIG.EVENT_SHAPEADDED,shape:uiObject}) } else { - + ORYX.Log.warn("add: ORYX.Core.UIObject is already a child of this object."); } } else { @@ -10367,7 +10367,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ if (this.children.member(uiObject)) { //remove uiObject from children var parent = uiObject.parent; - + this.children = this.children.without(uiObject); //delete parent reference of uiObject @@ -10389,17 +10389,17 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ if(this.eventHandlerCallback && silent !== true) this.eventHandlerCallback({type:ORYX.CONFIG.EVENT_SHAPEREMOVED,shape:uiObject, parent:parent}); - + uiObject.bounds.unregisterCallback(this._changedCallback); } else { ORYX.Log.warn("remove: ORYX.Core.UIObject is not a child of this object."); } }, - + /** * Creates shapes out of the given collection of shape objects and adds them to the canvas. - * @example + * @example * canvas.addShapeObjects({ bounds:{ lowerRight:{ y:510, x:633 }, upperLeft:{ y:146, x:210 } }, resourceId:"oryx_F0715955-50F2-403D-9851-C08CFE70F8BD", @@ -10411,22 +10411,22 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ outgoing:[{resourceId: 'aShape'}], target: {resourceId: 'aShape'} }); - * @param {Object} shapeObjects + * @param {Object} shapeObjects * @param {Function} [eventHandler] An event handler passed to each newly created shape (as eventHandlerCallback) * @return {Array} A collection of ORYX.Core.Shape * @methodOf ORYX.Core.Canvas.prototype */ addShapeObjects: function(shapeObjects, eventHandler){ if(!shapeObjects) return; - + this.initializingShapes = true; - + /*FIXME This implementation is very evil! At first, all shapes are created on canvas. In a second step, the attributes are applied. There must be a distinction between the configuration phase (where the outgoings, for example, are just named), and the creation phase (where the outgoings are evaluated). This must be reflected in code to provide a nicer API/ implementation!!! */ - + var addShape = function(shape, parent){ // Create a new Stencil var stencil = ORYX.Core.StencilSet.stencil(this.getStencil().namespace() + shape.stencil.id ); @@ -10436,16 +10436,16 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ var newShape = new ShapeClass( {'eventHandlerCallback': eventHandler}, stencil, this.facade); - + // Set the resource id newShape.resourceId = shape.resourceId; newShape.node.id = "svg-" + shape.resourceId; - + // Set parent to json object to be used later - // Due to the nested json structure, normally shape.parent is not set/ must not be set. + // Due to the nested json structure, normally shape.parent is not set/ must not be set. // In special cases, it can be easier to set this directly instead of a nested structure. shape.parent = "#" + ((shape.parent && shape.parent.resourceId) || parent.resourceId); - + // Add the shape to the canvas this.add( newShape ); @@ -10454,31 +10454,31 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ object: newShape }; }.bind(this); - + /** Builds up recursively a flatted array of shapes, including a javascript object and json representation * @param {Object} shape Any object that has Object#childShapes */ var addChildShapesRecursively = function(shape){ var addedShapes = []; - + if (shape.childShapes && shape.childShapes.constructor == String) { shape.childShapes = JSON.parse(shape.childShapes); } - + shape.childShapes.each(function(childShape){ addedShapes.push(addShape(childShape, shape)); addedShapes = addedShapes.concat(addChildShapesRecursively(childShape)); }); - + return addedShapes; }.bind(this); var shapes = addChildShapesRecursively({ - childShapes: shapeObjects, + childShapes: shapeObjects, resourceId: this.resourceId }); - + // prepare deserialisation parameter shapes.each( @@ -10491,7 +10491,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ value: shape.json.properties[field] }); } - + // Outgoings shape.json.outgoing.each(function(out){ properties.push({ @@ -10500,8 +10500,8 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ value: "#"+out.resourceId }); }); - - // Target + + // Target // (because of a bug, the first outgoing is taken when there is no target, // can be removed after some time) if(shape.object instanceof ORYX.Core.Edge) { @@ -10514,7 +10514,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ }); } } - + // Bounds if (shape.json.bounds) { properties.push({ @@ -10523,7 +10523,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ value: shape.json.bounds.upperLeft.x + "," + shape.json.bounds.upperLeft.y + "," + shape.json.bounds.lowerRight.x + "," + shape.json.bounds.lowerRight.y }); } - + //Dockers [{x:40, y:50}, {x:30, y:60}] => "40 50 30 60 #" if(shape.json.dockers){ properties.push({ @@ -10534,28 +10534,28 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ }) + " #" }); } - + //Parent properties.push({ prefix: 'raziel', name: 'parent', value: shape.json.parent }); - + shape.__properties = properties; }.bind(this) ); - + // Deserialize the properties from the shapes // This can't be done earlier because Shape#deserialize expects that all referenced nodes are already there - + // first, deserialize all nodes shapes.each(function(shape) { if(shape.object instanceof ORYX.Core.Node) { shape.object.deserialize(shape.__properties, shape.json); } }); - + // second, deserialize all edges shapes.each(function(shape) { if(shape.object instanceof ORYX.Core.Edge) { @@ -10564,11 +10564,11 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ shape.object._update(); } }); - + delete this.initializingShapes; return shapes.pluck("object"); }, - + /** * Updates the size of the canvas, regarding to the containg shapes. */ @@ -10581,8 +10581,8 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ var b = shape.bounds; maxWidth = Math.max( maxWidth, b.lowerRight().x + offset) maxHeight = Math.max( maxHeight, b.lowerRight().y + offset) - }); - + }); + if( this.bounds.width() < maxWidth || this.bounds.height() < maxHeight ){ this.setSize({width: Math.max(this.bounds.width(), maxWidth), height: Math.max(this.bounds.height(), maxHeight)}) } @@ -10591,18 +10591,18 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ getRootNode: function() { return this.rootNode; }, - + getUnderlayNode: function() { return this.underlayNode; }, - + getSvgContainer: function() { return this.node.childNodes[1]; }, - + getHTMLContainer: function() { return this._htmlContainer; - }, + }, /** * Return all elements of the same highest level @@ -10622,27 +10622,27 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ parentShape = parentShape.parent; } return true; - }); + }); }, setSize: function(size, dontSetBounds) { if(!size || !size.width || !size.height){return;}; - + if(this.rootNode.parentNode){ this.rootNode.parentNode.style.width = size.width + 'px'; this.rootNode.parentNode.style.height = size.height + 'px'; } - + this.rootNode.setAttributeNS(null, 'width', size.width); this.rootNode.setAttributeNS(null, 'height', size.height); - //this._htmlContainer.style.top = "-" + (size.height + 4) + 'px'; + //this._htmlContainer.style.top = "-" + (size.height + 4) + 'px'; if( !dontSetBounds ){ this.bounds.set({a:{x:0,y:0},b:{x:size.width/this.zoomLevel,y:size.height/this.zoomLevel}}); } }, - + /** * Returns an SVG document of the current process. * @param {Boolean} escapeText Use true, if you want to parse it with an XmlParser, @@ -10651,9 +10651,9 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ getSVGRepresentation: function(escapeText) { // Get the serialized svg image source var svgClone = this.getRootNode().cloneNode(true); - + this._removeInvisibleElements(svgClone); - + var x1, y1, x2, y2; this.getChildShapes(true).each(function(shape) { var absBounds = shape.absoluteBounds(); @@ -10671,7 +10671,7 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ y2 = Math.max(y2, lr.y); } }); - + var margin = 50; var width, height, tx, ty; if(x1 == undefined) { @@ -10685,14 +10685,14 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ tx = -x1+margin/2; ty = -y1+margin/2; } - + // Set the width and height svgClone.setAttributeNS(null, 'width', width + margin); svgClone.setAttributeNS(null, 'height', height + margin); - + //remove scale factor svgClone.childNodes[1].removeAttributeNS(null, 'transform'); - + try{ var svgCont = svgClone.childNodes[1].childNodes[1]; svgCont.parentNode.removeChild(svgCont); @@ -10702,33 +10702,33 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ $A(svgClone.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'tspan')).each(function(elem) { elem.textContent = elem.textContent.escapeHTML(); }); - + $A(svgClone.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'text')).each(function(elem) { if(elem.childNodes.length == 0) elem.textContent = elem.textContent.escapeHTML(); }); } - + // generating absolute urls for the pdf-exporter $A(svgClone.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'image')).each(function(elem) { var href = elem.getAttributeNS("http://www.w3.org/1999/xlink","href"); - + if(!href.match("^(http|https)://")) { href = window.location.protocol + "//" + window.location.host + href; elem.setAttributeNS("http://www.w3.org/1999/xlink", "href", href); } }); - - + + // escape all links $A(svgClone.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'a')).each(function(elem) { elem.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", (elem.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").escapeHTML()); }); - + return svgClone; }, - - /** + + /** * Removes all nodes (and its children) that has the * attribute visibility set to "hidden" */ @@ -10741,12 +10741,12 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ element.removeChild(child); } else { this._removeInvisibleElements(child); - index++; + index++; } } - + }, - + /** * This method checks all shapes on the canvas and removes all shapes that * contain invalid bounds values or dockers values(NaN) @@ -10790,15 +10790,15 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ this.eventHandlerCallback(event, this); } }, - + toString: function() { return "Canvas " + this.id }, - + /** * Calls {@link ORYX.Core.AbstractShape#toJSON} and adds some stencil set information. */ toJSON: function() { var json = arguments.callee.$.toJSON.apply(this, arguments); - + // if(ORYX.CONFIG.STENCILSET_HANDLER.length > 0) { // json.stencilset = { // url: this.getStencil().stencilSet().namespace() @@ -10807,10 +10807,10 @@ ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({ json.stencilset = { url: this.getStencil().stencilSet().source(), namespace: this.getStencil().stencilSet().namespace() - }; + }; // } - - + + return json; } });/* @@ -10832,11 +10832,11 @@ function init() { // Hack for WebKit to set the SVGElement-Classes ORYX.Editor.setMissingClasses(); - + // If someone wants to create the editor instance himself if (window.onOryxResourcesLoaded) { window.onOryxResourcesLoaded(); - } + } // Else fetch the model from server and display editor else { var modelId = window.location.search.substring(4); @@ -10860,51 +10860,51 @@ if(!ORYX) {var ORYX = {};} * @param {String} config.id Any ID that can be used inside the editor. If fullscreen=false, any HTML node with this id must be present to render the editor to this node. * @param {boolean} [config.fullscreen=true] Render editor in fullscreen mode or not. * @param {String} config.stencilset.url Stencil set URL. - * @param {String} [config.stencil.id] Stencil type used for creating the canvas. + * @param {String} [config.stencil.id] Stencil type used for creating the canvas. * @param {Object} config.properties Any properties applied to the canvas. */ ORYX.Editor = { /** @lends ORYX.Editor.prototype */ - // Defines the global dom event listener + // Defines the global dom event listener DOMEventListeners: new Hash(), // Defines the selection selection: [], - + // Defines the current zoom level zoomLevel:1.0, construct: function(config) { - + // initialization. this._eventsQueue = []; this.loadedPlugins = []; this.pluginsData = []; - - + + //meta data about the model for the signavio warehouse //directory, new, name, description, revision, model (the model data) - + this.modelMetaData = config; - + var model = config; - + this.id = model.modelId; - + if(config.model) { model = config.model; } - + if(!this.id) { this.id = model.id; if(!this.id) { this.id = ORYX.Editor.provideId(); } } - + // Defines if the editor should be fullscreen or not this.fullscreen = config.fullscreen !== false; - + // Initialize the eventlistener this._initEventListener(); @@ -10926,11 +10926,11 @@ ORYX.Editor = { // Initializing of a callback to check loading ends var loadPluginFinished = false; var loadContentFinished = false; - var initFinished = function(){ + var initFinished = function(){ if( !loadPluginFinished || !loadContentFinished ){ return } this._finishedLoading(); }.bind(this) - + // LOAD the plugins window.setTimeout(function(){ this.loadPlugins(); @@ -10946,16 +10946,16 @@ ORYX.Editor = { initFinished(); }.bind(this), 200); }, - + _finishedLoading: function() { // Raise Loaded Event this.handleEvents( {type:ORYX.CONFIG.EVENT_LOADED} ) }, - + _initEventListener: function(){ // Register on Events - + document.documentElement.addEventListener(ORYX.CONFIG.EVENT_KEYDOWN, this.catchKeyDownEvents.bind(this), false); document.documentElement.addEventListener(ORYX.CONFIG.EVENT_KEYUP, this.catchKeyUpEvents.bind(this), false); @@ -10969,32 +10969,32 @@ ORYX.Editor = { this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEOUT] = []; this.DOMEventListeners[ORYX.CONFIG.EVENT_SELECTION_CHANGED] = []; this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEMOVE] = []; - + }, - + /** * Generate the whole viewport of the * Editor and initialized the Ext-Framework - * + * */ _generateGUI: function() { // Defines the layout height if it's NOT fullscreen var layoutHeight = ORYX.CONFIG.WINDOW_HEIGHT; var canvasParent = this.getCanvas().rootNode.parentNode; - + jQuery("#canvasSection").append(canvasParent); - + // Set the editor to the center, and refresh the size canvasParent.parentNode.setAttributeNS(null, 'align', 'center'); canvasParent.setAttributeNS(null, 'align', 'left'); this.getCanvas().setSize({ width : ORYX.CONFIG.CANVAS_WIDTH, height : ORYX.CONFIG.CANVAS_HEIGHT - }); - + }); + }, - + getAvailablePlugins: function(){ var curAvailablePlugins=ORYX.availablePlugins.clone(); curAvailablePlugins.each(function(plugin){ @@ -11029,7 +11029,7 @@ ORYX.Editor = { }, /** * activate Plugin - * + * * @param {String} name * @param {Function} callback * callback(sucess, [errorCode]) @@ -11038,28 +11038,28 @@ ORYX.Editor = { activatePluginByName: function(name, callback, loadTry){ var match=this.getAvailablePlugins().find(function(value){return value.name==name}); - if(match && (!match.engaged || (match.engaged==='false'))){ + if(match && (!match.engaged || (match.engaged==='false'))){ var loadedStencilSetsNamespaces = this.getStencilSets().keys(); var facade = this._getPluginFacade(); var newPlugin; var me=this; ORYX.Log.debug("Initializing plugin '%0'", match.name); - + if (!match.requires || !match.requires.namespaces || match.requires.namespaces.any(function(req){ return loadedStencilSetsNamespaces.indexOf(req) >= 0 }) ){ if(!match.notUsesIn || !match.notUsesIn.namespaces || !match.notUsesIn.namespaces.any(function(req){ return loadedStencilSetsNamespaces.indexOf(req) >= 0 })){ - + try { - + var className = eval(match.name); var newPlugin = new className(facade, match); newPlugin.type = match.name; - + // If there is an GUI-Plugin, they get all Plugins-Offer-Meta-Data - if (newPlugin.registryChanged) + if (newPlugin.registryChanged) newPlugin.registryChanged(me.pluginsData); - + // If there have an onSelection-Method it will pushed to the Editor Event-Handler - if (newPlugin.onSelectionChanged) + if (newPlugin.onSelectionChanged) me.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, newPlugin.onSelectionChanged.bind(newPlugin)); this.loadedPlugins.push(newPlugin); this.loadedPlugins.each(function(loaded){ @@ -11067,7 +11067,7 @@ ORYX.Editor = { loaded.registryChanged(this.pluginsData); }.bind(me)); callback(true); - + } catch(e) { ORYX.Log.warn("Plugin %0 is not available", match.name); if(!!loadTry){ @@ -11080,13 +11080,13 @@ ORYX.Editor = { callback(false,"NOTUSEINSTENCILSET"); ORYX.Log.info("Plugin need a stencilset which is not loaded'", match.name); } - + } else { callback(false,"REQUIRESTENCILSET"); ORYX.Log.info("Plugin need a stencilset which is not loaded'", match.name); } - + }else{ callback(false, match?"NOTFOUND":"YETACTIVATED"); //TODO error handling @@ -11097,14 +11097,14 @@ ORYX.Editor = { * Laden der Plugins */ loadPlugins: function() { - + // if there should be plugins but still are none, try again. // TODO this should wait for every plugin respectively. /*if (!ORYX.Plugins && ORYX.availablePlugins.length > 0) { window.setTimeout(this.loadPlugins.bind(this), 100); return; }*/ - + var me = this; var newPlugins = []; @@ -11113,16 +11113,16 @@ ORYX.Editor = { // Available Plugins will be initalize var facade = this._getPluginFacade(); - + // If there is an Array where all plugins are described, than only take those // (that comes from the usage of oryx with a mashup api) if( ORYX.MashupAPI && ORYX.MashupAPI.loadablePlugins && ORYX.MashupAPI.loadablePlugins instanceof Array ){ - + // Get the plugins from the available plugins (those who are in the plugins.xml) ORYX.availablePlugins = $A(ORYX.availablePlugins).findAll(function(value){ return ORYX.MashupAPI.loadablePlugins.include( value.name ) }) - + // Add those plugins to the list, which are only in the loadablePlugins list ORYX.MashupAPI.loadablePlugins.each(function( className ){ if( !(ORYX.availablePlugins.find(function(val){ return val.name == className }))){ @@ -11130,8 +11130,8 @@ ORYX.Editor = { } }) } - - + + ORYX.availablePlugins.each(function(value) { ORYX.Log.debug("Initializing plugin '%0'", value.name); if( (!value.requires || !value.requires.namespaces || value.requires.namespaces.any(function(req){ return loadedStencilSetsNamespaces.indexOf(req) >= 0 }) ) && @@ -11150,11 +11150,11 @@ ORYX.Editor = { } catch(e) { ORYX.Log.warn("Plugin %0 is not available %1", value.name, e); } - + } else { ORYX.Log.info("Plugin need a stencilset which is not loaded'", value.name); } - + }); newPlugins.each(function(value) { @@ -11168,11 +11168,11 @@ ORYX.Editor = { }); this.loadedPlugins = newPlugins; - + this.registerPluginsOnKeyEvents(); - + this.setSelection(); - + }, /** @@ -11191,19 +11191,19 @@ ORYX.Editor = { // Get any root stencil type stencilType = this.getStencilSets().values()[0].findRootStencilName(); } - + // get the stencil associated with the type var canvasStencil = ORYX.Core.StencilSet.stencil(stencilType); - - if (!canvasStencil) + + if (!canvasStencil) ORYX.Log.fatal("Initialisation failed, because the stencil with the type %0 is not part of one of the loaded stencil sets.", stencilType); - + // create all dom // TODO fix border, so the visible canvas has a double border and some spacing to the scrollbars var div = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", null, ['div']); // set class for custom styling div.addClassName("ORYX_Editor"); - + // create the canvas this._canvas = new ORYX.Core.Canvas({ width : ORYX.CONFIG.CANVAS_WIDTH, @@ -11212,7 +11212,7 @@ ORYX.Editor = { id : this.id, parentNode : div }, canvasStencil, this._getPluginFacade()); - + if (canvasConfig) { // Migrate canvasConfig to an RDF-like structure //FIXME this isn't nice at all because we don't want rdf any longer @@ -11224,10 +11224,10 @@ ORYX.Editor = { value: canvasConfig[field] }); } - + this._canvas.deserialize(properties); } - + }, /** @@ -11256,23 +11256,23 @@ ORYX.Editor = { setSelection: this.setSelection.bind(this), updateSelection: this.updateSelection.bind(this), getCanvas: this.getCanvas.bind(this), - + importJSON: this.importJSON.bind(this), getJSON: this.getJSON.bind(this), getSerializedJSON: this.getSerializedJSON.bind(this), - + executeCommands: this.executeCommands.bind(this), isExecutingCommands: this.isExecutingCommands.bind(this), - + registerOnEvent: this.registerOnEvent.bind(this), unregisterOnEvent: this.unregisterOnEvent.bind(this), raiseEvent: this.handleEvents.bind(this), enableEvent: this.enableEvent.bind(this), disableEvent: this.disableEvent.bind(this), - + eventCoordinates: this.eventCoordinates.bind(this), eventCoordinatesXY: this.eventCoordinatesXY.bind(this), - + getModelMetaData: this.getModelMetaData.bind(this) }; @@ -11292,24 +11292,24 @@ ORYX.Editor = { * @param [] Array of commands */ executeCommands: function(commands){ - + if (!this.commandStack){ this.commandStack = []; } if (!this.commandStackExecuted){ this.commandStackExecuted = []; } - - + + this.commandStack = [].concat(this.commandStack) .concat(commands); - + // Check if already executes if (this.commandExecuting){ return; } - + // Start execution this.commandExecuting = true; - + // Iterate over all commands while(this.commandStack.length > 0){ var command = this.commandStack.shift(); @@ -11317,23 +11317,23 @@ ORYX.Editor = { command.execute(); this.commandStackExecuted.push(command); } - + // Raise event for executing commands this.handleEvents({ type : ORYX.CONFIG.EVENT_EXECUTE_COMMANDS, commands : this.commandStackExecuted }); - + // Remove temporary vars delete this.commandStack; delete this.commandStackExecuted; delete this.commandExecuting; - - + + this.updateSelection(); }, - + /** * Returns JSON of underlying canvas (calls ORYX.Canvas#toJSON()). * @return {Object} Returns JSON representation as JSON object. @@ -11344,7 +11344,7 @@ ORYX.Editor = { canvasJSON.ssextensions = this.getStencilSets().values()[0].extensions().keys().findAll(function(sse){ return !sse.endsWith('/meta#') }); return canvasJSON; }, - + /** * Serializes a call to toJSON(). * @return {String} Returns JSON representation as string. @@ -11352,7 +11352,7 @@ ORYX.Editor = { getSerializedJSON: function(){ return JSON.stringify(this.getJSON()); }, - + /** * Imports shapes in JSON as expected by {@link ORYX.Editor#loadSerialized} * @param {Object|String} jsonObject The (serialized) json object to be imported @@ -11360,12 +11360,12 @@ ORYX.Editor = { * @throws {SyntaxError} If the serialized json object contains syntax errors */ importJSON: function(jsonObject, noSelectionAfterImport) { - + try { jsonObject = this.renewResourceIds(jsonObject); } catch(error){ throw error; - } + } //check, if the imported json model can be loaded in this editor // (stencil set has to fit) if(jsonObject.stencilset.namespace && jsonObject.stencilset.namespace !== this.getCanvas().getStencil().stencilSet().namespace()) { @@ -11382,16 +11382,16 @@ ORYX.Editor = { this.parents = new Hash(); this.selection = this.facade.getSelection(); this.loadSerialized = loadSerializedCB; - }, + }, execute: function(){ - + if (!this.shapes) { - // Import the shapes out of the serialization - this.shapes = this.loadSerialized( this.jsonObject ); - + // Import the shapes out of the serialization + this.shapes = this.loadSerialized( this.jsonObject ); + //store all connections this.shapes.each(function(shape) { - + if (shape.getDockers) { var dockers = shape.getDockers(); if (dockers) { @@ -11403,7 +11403,7 @@ ORYX.Editor = { } } } - + //store parents this.parents[shape.id] = shape.parent; }.bind(this)); @@ -11411,57 +11411,57 @@ ORYX.Editor = { this.shapes.each(function(shape) { this.parents[shape.id].add(shape); }.bind(this)); - + this.connections.each(function(con) { con[0].setDockedShape(con[1]); con[0].setReferencePoint(con[2]); con[0].update(); }); } - + //this.parents.values().uniq().invoke("update"); - this.facade.getCanvas().update(); - + this.facade.getCanvas().update(); + if(!this.noSelection) this.facade.setSelection(this.shapes); else this.facade.updateSelection(); - - // call updateSize again, because during loadSerialized the edges' bounds + + // call updateSize again, because during loadSerialized the edges' bounds // are not yet initialized properly - this.facade.getCanvas().updateSize(); - + this.facade.getCanvas().updateSize(); + }, rollback: function(){ var selection = this.facade.getSelection(); - + this.shapes.each(function(shape) { selection = selection.without(shape); this.facade.deleteShape(shape); }.bind(this)); - + /*this.parents.values().uniq().each(function(parent) { if(!this.shapes.member(parent)) parent.update(); }.bind(this));*/ - + this.facade.getCanvas().update(); - + this.facade.setSelection(selection); } }) - - var command = new commandClass(jsonObject, + + var command = new commandClass(jsonObject, this.loadSerialized.bind(this), noSelectionAfterImport, this._getPluginFacade()); - - this.executeCommands([command]); - + + this.executeCommands([command]); + return command.shapes.clone(); } }, - + /** * This method renew all resource Ids and according references. * Warning: The implementation performs a substitution on the serialized object for @@ -11483,24 +11483,24 @@ ORYX.Editor = { } } else { var serJsonObject = JSON.stringify(jsonObject); - } - + } + // collect all resourceIds recursively var collectResourceIds = function(shapes){ if(!shapes) return []; - + return shapes.map(function(shape){ return collectResourceIds(shape.childShapes).concat(shape.resourceId); }).flatten(); } var resourceIds = collectResourceIds(jsonObject.childShapes); - + // Replace each resource id by a new one resourceIds.each(function(oldResourceId){ var newResourceId = ORYX.Editor.provideId(); serJsonObject = serJsonObject.replace(new RegExp(oldResourceId, 'g'), newResourceId); }); - + return JSON.parse(serJsonObject); }, @@ -11533,7 +11533,7 @@ ORYX.Editor = { * @param {Object} model Description of the model to load. * @param {Array} [model.ssextensions] List of stenctil set extensions. * @param {String} model.stencilset.url - * @param {String} model.stencil.id + * @param {String} model.stencil.id * @param {Array} model.childShapes * @param {Array} [model.properties] * @param {String} model.resourceId @@ -11542,11 +11542,11 @@ ORYX.Editor = { */ loadSerialized: function(model, requestMeta){ var canvas = this.getCanvas(); - + // Bugfix (cf. http://code.google.com/p/oryx-editor/issues/detail?id=240) // Deserialize the canvas' stencil set extensions properties first! this.loadSSExtensions(model.ssextensions); - + // Load Meta Data Extension if available // #Signavio if (requestMeta === true) { @@ -11555,9 +11555,9 @@ ORYX.Editor = { this.loadSSExtension(metaDataExtension); } } - + var shapes = this.getCanvas().addShapeObjects(model.childShapes, this.handleEvents.bind(this)); - + if(model.properties) { for(key in model.properties) { var value = model.properties[key]; @@ -11568,17 +11568,17 @@ ORYX.Editor = { this.getCanvas().setProperty("oryx-" + key, value); } } - - + + this.getCanvas().updateSize(); - + // Force to update the selection this.selection = [null]; this.setSelection([]); - + return shapes; }, - + /** * Return the namespace of the extension which * provided all the self defined meta data @@ -11589,15 +11589,15 @@ ORYX.Editor = { if (!this.ss_extensions_def||!(this.ss_extensions_def.extensions instanceof Array)){ return null; } - + var stencilsets = this.getStencilSets(); var extension = this.ss_extensions_def.extensions.find(function(ex){ return !!stencilsets[ex["extends"]] && ex.namespace.endsWith("/meta#"); }); - - return extension ? extension.namespace || null : null; + + return extension ? extension.namespace || null : null; }, - + /** * Calls ORYX.Editor.prototype.ss_extension_namespace for each element * @param {Array} ss_extension_namespaces An array of stencil set extension namespaces. @@ -11609,44 +11609,44 @@ ORYX.Editor = { this.loadSSExtension(ss_extension_namespace); }.bind(this)); }, - + /** * Loads a stencil set extension. * The stencil set extensions definiton file must already * be loaded when the editor is initialized. */ - loadSSExtension: function(ss_extension_namespace) { - + loadSSExtension: function(ss_extension_namespace) { + if (this.ss_extensions_def) { var extension = this.ss_extensions_def.extensions.find(function(ex){ return (ex.namespace == ss_extension_namespace); }); - + if (!extension) { return; } - + var stencilset = this.getStencilSets()[extension["extends"]]; - + if (!stencilset) { return; } - + // Check if absolute or relative url if ((extension["definition"]||"").startsWith("/")){ stencilset.addExtension(extension["definition"]) } else { stencilset.addExtension(ORYX.CONFIG.SS_EXTENSIONS_FOLDER + extension["definition"]) } - + //stencilset.addExtension("/oryx/build/stencilsets/extensions/" + extension["definition"]) this.getRules().initializeRules(stencilset); - + this._getPluginFacade().raiseEvent({ type: ORYX.CONFIG.EVENT_STENCIL_SET_LOADED }); } - + }, disableEvent: function(eventType){ @@ -11666,11 +11666,11 @@ ORYX.Editor = { if(eventType == ORYX.CONFIG.EVENT_KEYDOWN) { this._keydownEnabled = true; } - + if(eventType == ORYX.CONFIG.EVENT_KEYUP) { this._keyupEnabled = true; } - + if(this.DOMEventListeners.keys().member("disable_" + eventType)) { var value = this.DOMEventListeners.remove("disable_" + eventType); this.DOMEventListeners[eventType] = value; @@ -11701,14 +11701,14 @@ ORYX.Editor = { return this.selection || []; }, - getStencilSets: function() { - return ORYX.Core.StencilSet.stencilSets(this.id); + getStencilSets: function() { + return ORYX.Core.StencilSet.stencilSets(this.id); }, - + getRules: function() { return ORYX.Core.StencilSet.rules(this.id); }, - + loadStencilSet: function(source) { try { ORYX.Core.StencilSet.loadStencilSet(source, this.modelMetaData, this.id); @@ -11723,96 +11723,96 @@ ORYX.Editor = { this.pluginsData.push(pluginData); } }, - + /** * It creates an new event or adds the callback, if already existing, * for the key combination that the plugin passes in keyCodes attribute * of the offer method. - * + * * The new key down event fits the schema: * key.event[.metactrl][.alt][.shift].'thekeyCode' */ registerPluginsOnKeyEvents: function() { this.pluginsData.each(function(pluginData) { - + if(pluginData.keyCodes) { - + pluginData.keyCodes.each(function(keyComb) { var eventName = "key.event"; - + /* Include key action */ eventName += '.' + keyComb.keyAction; - + if(keyComb.metaKeys) { /* Register on ctrl or apple meta key as meta key */ if(keyComb.metaKeys. indexOf(ORYX.CONFIG.META_KEY_META_CTRL) > -1) { eventName += "." + ORYX.CONFIG.META_KEY_META_CTRL; } - + /* Register on alt key as meta key */ if(keyComb.metaKeys. indexOf(ORYX.CONFIG.META_KEY_ALT) > -1) { eventName += '.' + ORYX.CONFIG.META_KEY_ALT; } - + /* Register on shift key as meta key */ if(keyComb.metaKeys. indexOf(ORYX.CONFIG.META_KEY_SHIFT) > -1) { eventName += '.' + ORYX.CONFIG.META_KEY_SHIFT; - } + } } - + /* Register on the actual key */ if(keyComb.keyCode) { eventName += '.' + keyComb.keyCode; } - + /* Register the event */ ORYX.Log.debug("Register Plugin on Key Event: %0", eventName); if (pluginData.toggle === true && pluginData.buttonInstance) { this.registerOnEvent(eventName, function(){ - pluginData.buttonInstance.toggle(!pluginData.buttonInstance.pressed); // Toggle + pluginData.buttonInstance.toggle(!pluginData.buttonInstance.pressed); // Toggle pluginData.functionality.call(pluginData, pluginData.buttonInstance, pluginData.buttonInstance.pressed); // Call function }); } else { this.registerOnEvent(eventName, pluginData.functionality) } - + }.bind(this)); } }.bind(this)); }, - + isEqual: function(a,b){ return a === b || (a.length === b.length && a.all(function(r){ return b.include(r) })) }, - + isDirty: function(a){ return a.any(function(shape){ return shape.isPropertyChanged() }) }, setSelection: function(elements, subSelectionElement, force) { - + if (!elements) { elements = []; } if (!(elements instanceof Array)) { elements = [elements]; } - + elements = elements.findAll(function(n){ return n && n instanceof ORYX.Core.Shape }); - + if (elements[0] instanceof ORYX.Core.Canvas) { elements = []; } - + if (!force && this.isEqual(this.selection, elements) && !this.isDirty(elements)){ return; } - + this.selection = elements; this._subSelection = subSelectionElement; - + this.handleEvents({type:ORYX.CONFIG.EVENT_SELECTION_CHANGED, elements:elements, subSelection: subSelectionElement, force: !!force}) }, - + updateSelection: function() { this.setSelection(this.selection, this._subSelection, true); /*var s = this.selection; @@ -11823,7 +11823,7 @@ ORYX.Editor = { getCanvas: function() { return this._canvas; }, - + /** * option = { @@ -11840,25 +11840,25 @@ ORYX.Editor = { createShape: function(option) { if(option && option.serialize && option.serialize instanceof Array){ - + var type = option.serialize.find(function(obj){return (obj.prefix+"-"+obj.name) == "oryx-type"}); var stencil = ORYX.Core.StencilSet.stencil(type.value); - + if(stencil.type() == 'node'){ - var newShapeObject = new ORYX.Core.Node({'eventHandlerCallback':this.handleEvents.bind(this)}, stencil, this._getPluginFacade()); + var newShapeObject = new ORYX.Core.Node({'eventHandlerCallback':this.handleEvents.bind(this)}, stencil, this._getPluginFacade()); } else { - var newShapeObject = new ORYX.Core.Edge({'eventHandlerCallback':this.handleEvents.bind(this)}, stencil, this._getPluginFacade()); + var newShapeObject = new ORYX.Core.Edge({'eventHandlerCallback':this.handleEvents.bind(this)}, stencil, this._getPluginFacade()); } - + this.getCanvas().add(newShapeObject); newShapeObject.deserialize(option.serialize); - + return newShapeObject; } // If there is no argument, throw an exception if(!option || !option.type || !option.namespace) { throw "To create a new shape you have to give an argument with type and namespace";} - + var canvas = this.getCanvas(); var newShapeObject; @@ -11873,7 +11873,7 @@ ORYX.Editor = { } else { newShapeObject = new ORYX.Core.Edge({'eventHandlerCallback':this.handleEvents.bind(this)}, sset.stencil(shapetype), this._getPluginFacade()) } - + // when there is a template, inherit the properties. if(option.template) { @@ -11887,53 +11887,53 @@ ORYX.Editor = { } else { canvas.add(newShapeObject); } - - + + // Set the position var point = option.position ? option.position : {x:100, y:200}; - - + + var con; // If there is create a shape and in the argument there is given an ConnectingType and is instance of an edge if(option.connectingType && option.connectedShape && !(newShapeObject instanceof ORYX.Core.Edge)) { // there will be create a new Edge con = new ORYX.Core.Edge({'eventHandlerCallback':this.handleEvents.bind(this)}, sset.stencil(option.connectingType)); - + // And both endings dockers will be referenced to the both shapes con.dockers.first().setDockedShape(option.connectedShape); - + var magnet = option.connectedShape.getDefaultMagnet() var cPoint = magnet ? magnet.bounds.center() : option.connectedShape.bounds.midPoint(); con.dockers.first().setReferencePoint( cPoint ); con.dockers.last().setDockedShape(newShapeObject); - con.dockers.last().setReferencePoint(newShapeObject.getDefaultMagnet().bounds.center()); - + con.dockers.last().setReferencePoint(newShapeObject.getDefaultMagnet().bounds.center()); + // The Edge will be added to the canvas and be updated - canvas.add(con); + canvas.add(con); //con.update(); - - } - + + } + // Move the new Shape to the position if(newShapeObject instanceof ORYX.Core.Edge && option.connectedShape) { newShapeObject.dockers.first().setDockedShape(option.connectedShape); - + if( option.connectedShape instanceof ORYX.Core.Node ){ - newShapeObject.dockers.first().setReferencePoint(option.connectedShape.getDefaultMagnet().bounds.center()); - newShapeObject.dockers.last().bounds.centerMoveTo(point); + newShapeObject.dockers.first().setReferencePoint(option.connectedShape.getDefaultMagnet().bounds.center()); + newShapeObject.dockers.last().bounds.centerMoveTo(point); } else { - newShapeObject.dockers.first().setReferencePoint(option.connectedShape.bounds.midPoint()); + newShapeObject.dockers.first().setReferencePoint(option.connectedShape.bounds.midPoint()); } - + var start = newShapeObject.dockers.first(); var end = newShapeObject.dockers.last(); - + if(start.getDockedShape() && end.getDockedShape()) { var startPoint = start.getAbsoluteReferencePoint(); var endPoint = end.getAbsoluteReferencePoint(); - + var docker = newShapeObject.createDocker(); docker.bounds.centerMoveTo({ x: startPoint.x + (endPont.x - startPoint.x) / 2, @@ -11942,50 +11942,50 @@ ORYX.Editor = { } } else { - + var b = newShapeObject.bounds if( newShapeObject instanceof ORYX.Core.Node && newShapeObject.dockers.length == 1){ b = newShapeObject.dockers.first().bounds } - + b.centerMoveTo(point); - + var upL = b.upperLeft(); b.moveBy( -Math.min(upL.x, 0) , -Math.min(upL.y, 0) ) - + var lwR = b.lowerRight(); b.moveBy( -Math.max(lwR.x-canvas.bounds.width(), 0) , -Math.max(lwR.y-canvas.bounds.height(), 0) ) - + } - + // Update the shape if (newShapeObject instanceof ORYX.Core.Edge) { newShapeObject._update(false); } - + // And refresh the selection if(!(newShapeObject instanceof ORYX.Core.Edge)&&!(option.dontUpdateSelection)) { this.setSelection([newShapeObject]); } - + if(con && con.alignDockers) { //con.alignDockers(); - } + } if(newShapeObject.alignDockers) { newShapeObject.alignDockers(); } return newShapeObject; }, - + deleteShape: function(shape) { - + if (!shape || !shape.parent){ return } - + //remove shape from parent // this also removes it from DOM shape.parent.remove(shape); - + //delete references to outgoing edges shape.getOutgoingShapes().each(function(os) { var docker = os.getDockers().first(); @@ -11993,7 +11993,7 @@ ORYX.Editor = { docker.setDockedShape(undefined); } }); - + //delete references to incoming edges shape.getIncomingShapes().each(function(is) { var docker = is.getDockers().last(); @@ -12001,19 +12001,19 @@ ORYX.Editor = { docker.setDockedShape(undefined); } }); - + //delete references of the shape's dockers shape.getDockers().each(function(docker) { docker.setDockedShape(undefined); }); }, - + /** * Returns an object with meta data about the model. * Like name, description, ... - * + * * Empty object with the current backend. - * + * * @return {Object} Meta data about the model */ getModelMetaData: function() { @@ -12021,7 +12021,7 @@ ORYX.Editor = { }, /* Event-Handler Methods */ - + /** * Helper method to execute an event immediately. The event is not * scheduled in the _eventsQueue. Needed to handle Layout-Callbacks. @@ -12029,7 +12029,7 @@ ORYX.Editor = { _executeEventImmediately: function(eventObj) { if(this.DOMEventListeners.keys().member(eventObj.event.type)) { this.DOMEventListeners[eventObj.event.type].each((function(value) { - value(eventObj.event, eventObj.arg); + value(eventObj.event, eventObj.arg); }).bind(this)); } }, @@ -12042,14 +12042,14 @@ ORYX.Editor = { } this._queueRunning = false; }, - + /** * Leitet die Events an die Editor-Spezifischen Event-Methoden weiter * @param {Object} event Event , welches gefeuert wurde * @param {Object} uiObj Target-UiObj */ handleEvents: function(event, uiObj) { - + ORYX.Log.trace("Dispatching event type %0 on %1", event.type, uiObj); switch(event.type) { @@ -12075,11 +12075,11 @@ ORYX.Editor = { } else { this._eventsQueue.push({event: event, arg: uiObj}); } - + if(!this._queueRunning) { this._executeEvents(); } - + // TODO: Make this return whether no listener returned false. // So that, when one considers bubbling undesireable, it won't happen. return false; @@ -12100,28 +12100,28 @@ ORYX.Editor = { return; } /* assure we have the current event. */ - if (!event) + if (!event) event = window.event; - + // Checks if the event comes from some input field if (!this.isValidEvent(event)){ return; } - + /* Create key up event type */ var keyUpEvent = this.createKeyCombEvent(event, ORYX.CONFIG.KEY_ACTION_UP); - + ORYX.Log.debug("Key Event to handle: %0", keyUpEvent); /* forward to dispatching. */ this.handleEvents({type: keyUpEvent, event:event}); }, - + /** - * Catches all key down events and forward the appropriated event to + * Catches all key down events and forward the appropriated event to * dispatching concerning to the pressed keys. - * - * @param {Event} + * + * @param {Event} * The key down event to handle */ catchKeyDownEvents: function(event) { @@ -12129,9 +12129,9 @@ ORYX.Editor = { return; } /* Assure we have the current event. */ - if (!event) + if (!event) event = window.event; - + /* Fixed in FF3 */ // This is a mac-specific fix. The mozilla event object has no knowledge // of meta key modifier on osx, however, it is needed for certain @@ -12143,24 +12143,24 @@ ORYX.Editor = { // event.appleMetaKey = true; //} //this.__currentKey = pressedKey; - + // Checks if the event comes from some input field if (!this.isValidEvent(event)){ return; } - + /* Create key up event type */ var keyDownEvent = this.createKeyCombEvent(event, ORYX.CONFIG.KEY_ACTION_DOWN); - + ORYX.Log.debug("Key Event to handle: %0", keyDownEvent); - + /* Forward to dispatching. */ this.handleEvents({type: keyDownEvent,event: event}); }, - + /** * Creates the event type name concerning to the pressed keys. - * + * * @param {Event} keyDownEvent * The source keyDownEvent to build up the event name */ @@ -12169,41 +12169,41 @@ ORYX.Editor = { /* Get the currently pressed key code. */ var pressedKey = keyEvent.which || keyEvent.keyCode; //this.__currentKey = pressedKey; - + /* Event name */ var eventName = "key.event"; - + /* Key action */ if(keyAction) { eventName += "." + keyAction; } - + /* Ctrl or apple meta key is pressed */ if(keyEvent.ctrlKey || keyEvent.metaKey) { eventName += "." + ORYX.CONFIG.META_KEY_META_CTRL; } - + /* Alt key is pressed */ if(keyEvent.altKey) { eventName += "." + ORYX.CONFIG.META_KEY_ALT; } - + /* Alt key is pressed */ if(keyEvent.shiftKey) { eventName += "." + ORYX.CONFIG.META_KEY_SHIFT; } - + /* Return the composed event name */ return eventName + "." + pressedKey; }, _handleMouseDown: function(event, uiObj) { - + // get canvas. var canvas = this.getCanvas(); // Try to get the focus canvas.focus() - + // find the shape that is responsible for this element's id. var element = event.currentTarget; var elementController = uiObj; @@ -12242,7 +12242,7 @@ ORYX.Editor = { // not selected, add it to the selection. } else if(currentIsSelectable && modifierKeyPressed && !currentIsSelected) { - + var newSelection = this.selection.clone(); newSelection.push(elementController) this.setSelection(newSelection) @@ -12269,9 +12269,9 @@ ORYX.Editor = { // Rule #2: When clicked on something that is neither // selectable nor movable, clear the selection, and return. } else if (!currentIsSelectable && !currentIsMovable) { - + this.setSelection([]); - + ORYX.Log.trace("Rule #2 applied for mouse down on %0", element.id); return; @@ -12281,25 +12281,25 @@ ORYX.Editor = { // the movedObject to the current one and enable Drag. Dockers will // be processed in the dragDocker plugin. } else if(!currentIsSelectable && currentIsMovable && !(elementController instanceof ORYX.Core.Controls.Docker)) { - + // TODO: If there is any moveable elements, do this in a plugin //ORYX.Core.UIEnableDrag(event, elementController); ORYX.Log.trace("Rule #7 applied for mouse down on %0", element.id); - - // Rule #8: When the element is selectable and is currently selected and no + + // Rule #8: When the element is selectable and is currently selected and no // modifier key is pressed } else if(currentIsSelectable && currentIsSelected && !modifierKeyPressed) { - + this._subSelection = this._subSelection != elementController ? elementController : undefined; - + this.setSelection(this.selection, this._subSelection); - + ORYX.Log.trace("Rule #8 applied for mouse down on %0", element.id); } - - + + // prevent event from bubbling, return. //Event.stop(event); return; @@ -12342,7 +12342,7 @@ ORYX.Editor = { var svgPoint = canvas.node.ownerSVGElement.createSVGPoint(); svgPoint.x = event.clientX; svgPoint.y = event.clientY; - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -12354,16 +12354,16 @@ ORYX.Editor = { } } } - + if (additionalIEZoom !== 1) { svgPoint.x = svgPoint.x * additionalIEZoom; svgPoint.y = svgPoint.y * additionalIEZoom; } - + var matrix = canvas.node.getScreenCTM(); return svgPoint.matrixTransform(matrix.inverse()); }, - + eventCoordinatesXY: function(x, y) { var canvas = this.getCanvas(); @@ -12371,7 +12371,7 @@ ORYX.Editor = { var svgPoint = canvas.node.ownerSVGElement.createSVGPoint(); svgPoint.x = x; svgPoint.y = y; - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -12383,12 +12383,12 @@ ORYX.Editor = { } } } - + if (additionalIEZoom !== 1) { svgPoint.x = svgPoint.x * additionalIEZoom; svgPoint.y = svgPoint.y * additionalIEZoom; } - + var matrix = canvas.node.getScreenCTM(); return svgPoint.matrixTransform(matrix.inverse()); } @@ -12506,39 +12506,39 @@ ORYX.Editor.resizeFix = function() { window.resizeBy(1,1); window.resizeBy(-1,-1); ORYX.Editor._resizefixTimeout = null; - }, 100); + }, 100); } }; ORYX.Editor.Cookie = { - + callbacks:[], - + onChange: function( callback, interval ){ - + this.callbacks.push(callback); this.start( interval ) - + }, - + start: function( interval ){ - + if( this.pe ){ return; } - + var currentString = document.cookie; - + this.pe = new PeriodicalExecuter( function(){ - + if( currentString != document.cookie ){ currentString = document.cookie; this.callbacks.each(function(callback){ callback(this.getParams()) }.bind(this)); } - - }.bind(this), ( interval || 10000 ) / 1000); + + }.bind(this), ( interval || 10000 ) / 1000); }, - + stop: function(){ if( this.pe ){ @@ -12546,16 +12546,16 @@ ORYX.Editor.Cookie = { this.pe = null; } }, - + getParams: function(){ var res = {}; - + var p = document.cookie; p.split("; ").each(function(param){ res[param.split("=")[0]] = param.split("=")[1];}); - + return res; - }, - + }, + toString: function(){ return document.cookie; } @@ -12563,13 +12563,13 @@ ORYX.Editor.Cookie = { /** * Workaround for SAFARI/Webkit, because - * when trying to check SVGSVGElement of instanceof there is + * when trying to check SVGSVGElement of instanceof there is * raising an error - * + * */ ORYX.Editor.SVGClassElementsAreAvailable = true; ORYX.Editor.setMissingClasses = function() { - + try { SVGElement; } catch(e) { @@ -12586,12 +12586,12 @@ ORYX.Editor.setMissingClasses = function() { SVGLineElement = document.createElementNS('http://www.w3.org/2000/svg', 'line').toString(); SVGPolylineElement = document.createElementNS('http://www.w3.org/2000/svg', 'polyline').toString(); SVGPolygonElement = document.createElementNS('http://www.w3.org/2000/svg', 'polygon').toString(); - + } - + } ORYX.Editor.checkClassType = function( classInst, classType ) { - + if( ORYX.Editor.SVGClassElementsAreAvailable ){ return classInst instanceof classType } else { @@ -12616,79 +12616,79 @@ if(!ORYX.Core) {ORYX.Core = {};} new function(){ - + ORYX.Core.UIEnableDrag = function(event, uiObj, option) { - + this.uiObj = uiObj; var upL = uiObj.bounds.upperLeft(); - + var a = uiObj.node.getScreenCTM(); this.faktorXY= {x: a.a, y: a.d}; - + this.scrollNode = uiObj.node.ownerSVGElement.parentNode.parentNode; - + this.offSetPosition = { x: Event.pointerX(event) - (upL.x * this.faktorXY.x), y: Event.pointerY(event) - (upL.y * this.faktorXY.y)}; - + this.offsetScroll = {x:this.scrollNode.scrollLeft,y:this.scrollNode.scrollTop}; - + this.dragCallback = ORYX.Core.UIDragCallback.bind(this); this.disableCallback = ORYX.Core.UIDisableDrag.bind(this); - + this.movedCallback = option ? option.movedCallback : undefined; this.upCallback = option ? option.upCallback : undefined; - + document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.disableCallback, true); document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.dragCallback , false); - + }; - + ORYX.Core.UIDragCallback = function(event) { - + var position = { x: Event.pointerX(event) - this.offSetPosition.x, y: Event.pointerY(event) - this.offSetPosition.y} - - position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; + + position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; position.y -= this.offsetScroll.y - this.scrollNode.scrollTop; - + position.x /= this.faktorXY.x; position.y /= this.faktorXY.y; - + this.uiObj.bounds.moveTo(position); //this.uiObj.update(); - + if(this.movedCallback) this.movedCallback(event); - + //Event.stop(event); - + }; - + ORYX.Core.UIDisableDrag = function(event) { document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.dragCallback, false); document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.disableCallback, true); - + if(this.upCallback) this.upCallback(event); - + this.upCallback = undefined; - this.movedCallback = undefined; - - Event.stop(event); + this.movedCallback = undefined; + + Event.stop(event); }; - + /** * Implements a command to move docker by an offset. - * + * * @class ORYX.Core.MoveDockersCommand * @param {Object} object An object with the docker id as key and docker and offset as object value - * - */ + * + */ ORYX.Core.MoveDockersCommand = ORYX.Core.Command.extend({ construct: function(dockers){ this.dockers = $H(dockers); @@ -12701,11 +12701,11 @@ new function(){ } else { this.changes = $H({}); } - + this.dockers.values().each(function(docker){ var edge = docker.docker.parent; if (!edge){ return } - + if (!this.changes[edge.getId()]) { this.changes[edge.getId()] = { edge : edge, @@ -12730,8 +12730,8 @@ new function(){ this.changes.values().each(function(change){ // Reset the dockers this.removeAllDocker(change.edge); - change.dockerPositions.each(function(pos, i){ - if (i==0||i==change.dockerPositions.length-1){ return } + change.dockerPositions.each(function(pos, i){ + if (i==0||i==change.dockerPositions.length-1){ return } var docker = change.edge.createDocker(undefined, pos); docker.bounds.centerMoveTo(pos); docker.update(); @@ -12743,8 +12743,8 @@ new function(){ this.changes.values().each(function(change){ // Reset the dockers this.removeAllDocker(change.edge); - change.oldDockerPositions.each(function(pos, i){ - if (i==0||i==change.oldDockerPositions.length-1){ return } + change.oldDockerPositions.each(function(pos, i){ + if (i==0||i==change.oldDockerPositions.length-1){ return } var docker = change.edge.createDocker(undefined, pos); docker.bounds.centerMoveTo(pos); docker.update(); @@ -12758,7 +12758,7 @@ new function(){ }) } }); - + }(); /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -12788,23 +12788,23 @@ ORYX.Core.Shape = { construct: function(options, stencil, facade) { // call base class constructor arguments.callee.$.construct.apply(this, arguments); - + this.facade = facade; this.dockers = []; this.magnets = []; - + this._defaultMagnet; - + this.incoming = []; this.outgoing = []; - + this.nodes = []; - + this._dockerChangedCallback = this._dockerChanged.bind(this); - + //Hash map for all labels. Labels are not treated as children of shapes. this._labels = new Hash(); - + // create SVG node this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, @@ -12816,7 +12816,7 @@ ORYX.Core.Shape = { ], ['g', {"class": "controls"}, ['g', {"class": "dockers"}], - ['g', {"class": "magnets"}] + ['g', {"class": "magnets"}] ] ]); }, @@ -12829,14 +12829,14 @@ ORYX.Core.Shape = { //this.layout(); //} }, - + /** * !!!Not called from any sub class!!! */ _update: function() { }, - + /** * Calls the super class refresh method * and updates the svg elements that are referenced by a property. @@ -12844,7 +12844,7 @@ ORYX.Core.Shape = { refresh: function() { //call base class refresh method arguments.callee.$.refresh.apply(this, arguments); - + if(this.node.ownerDocument) { //adjust SVG to properties' values var me = this; @@ -12854,7 +12854,7 @@ ORYX.Core.Shape = { var property = this.getStencil().property(propChanged.key); if (property != undefined) { this.propertiesChanged[propChanged.key] = false; - + //handle choice properties if(property.type() == ORYX.CONFIG.TYPE_CHOICE) { //iterate all references to SVG elements @@ -12867,7 +12867,7 @@ ORYX.Core.Shape = { } } }).bind(this)); - + //if the choice's items are referencing SVG elements // show the selected and hide all other referenced SVG // elements @@ -12875,25 +12875,25 @@ ORYX.Core.Shape = { property.items().each((function(item) { item.refToView().each((function(itemRef) { if(itemRef == "") { return; } - + var svgElem = this.node.ownerDocument.getElementById(this.id + itemRef); - + if(!svgElem) { return; } - - + + /* Do not refresh the same svg element multiple times */ if(!refreshedSvgElements[svgElem.id] || prop == item.value()) { svgElem.setAttributeNS(null, 'display', ((prop == item.value()) ? 'inherit' : 'none')); refreshedSvgElements[svgElem.id] = svgElem; } - + // Reload the href if there is an image-tag if(ORYX.Editor.checkClassType(svgElem, SVGImageElement)) { svgElem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', svgElem.getAttributeNS('http://www.w3.org/1999/xlink', 'href')); } }).bind(this)); }).bind(this)); - + } else { //handle properties that are not of type choice //iterate all references to SVG elements property.refToView().each((function(ref) { @@ -12903,13 +12903,13 @@ ORYX.Core.Shape = { if(ref === "") { return; } var refId = this.id + ref; - + if (property.type() === ORYX.CONFIG.TYPE_KISBPM_MULTIINSTANCE) { if (ref === "multiinstance") { - + var svgElemParallel = this.node.ownerDocument.getElementById(this.id + 'parallel'); - if(svgElemParallel) + if(svgElemParallel) { if (prop === 'Parallel') { @@ -12919,11 +12919,11 @@ ORYX.Core.Shape = { { svgElemParallel.setAttributeNS(null, 'display', 'none'); } - } - + } + var svgElemSequential = this.node.ownerDocument.getElementById(this.id + 'sequential'); - - if(svgElemSequential) + + if(svgElemSequential) { if (prop === 'Sequential') { @@ -12933,16 +12933,16 @@ ORYX.Core.Shape = { { svgElemSequential.setAttributeNS(null, 'display', 'none'); } - } + } } return; - - } + + } else if (property.type() === "cancelactivity") { var svgElemFrame = this.node.ownerDocument.getElementById(this.id + 'frame'); var svgElemFrame2 = this.node.ownerDocument.getElementById(this.id + 'frame2'); - + if (prop === 'true') { svgElemFrame.setAttributeNS(null, 'display', 'inherit'); @@ -12954,29 +12954,29 @@ ORYX.Core.Shape = { svgElemFrame2.setAttributeNS(null, 'display', 'none'); } } - + //get the SVG element var svgElem = this.node.ownerDocument.getElementById(refId); - + //if the SVG element can not be found - if(!svgElem || !(svgElem.ownerSVGElement)) { + if(!svgElem || !(svgElem.ownerSVGElement)) { //if the referenced SVG element is a SVGAElement, it cannot // be found with getElementById (Firefox bug). // this is a work around if(property.type() === ORYX.CONFIG.TYPE_URL || property.type() === ORYX.CONFIG.TYPE_DIAGRAM_LINK) { var svgElems = this.node.ownerDocument.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'a'); - + svgElem = $A(svgElems).find(function(elem) { return elem.getAttributeNS(null, 'id') === refId; }); - - if(!svgElem) { return; } + + if(!svgElem) { return; } } else { //this.propertiesChanged[propChanged.key] = true; return; - } + } } - + if (property.complexAttributeToView()) { var label = this._labels[refId]; if (label) { @@ -12988,33 +12988,33 @@ ORYX.Core.Shape = { label.text(prop); } } - + } else { switch (property.type()) { - case ORYX.CONFIG.TYPE_BOOLEAN: + case ORYX.CONFIG.TYPE_BOOLEAN: if (typeof prop == "string") prop = prop === "true" - + svgElem.setAttributeNS(null, 'display', (!(prop === property.inverseBoolean())) ? 'inherit' : 'none'); - + break; case ORYX.CONFIG.TYPE_COLOR: if(property.fill()) { if (svgElem.tagName.toLowerCase() === "stop"){ if (prop){ - + if (property.lightness() && property.lightness() !== 1){ prop = ORYX.Utils.adjustLightness(prop, property.lightness()); } - + svgElem.setAttributeNS(null, "stop-color", prop); - + // Adjust stop color of the others if (svgElem.parentNode.tagName.toLowerCase() === "radialgradient"){ ORYX.Utils.adjustGradient(svgElem.parentNode, svgElem); } } - + // If there is no value, set opaque if (svgElem.parentNode.tagName.toLowerCase() === "radialgradient"){ $A(svgElem.parentNode.getElementsByTagName('stop')).each(function(stop){ @@ -13046,7 +13046,7 @@ ORYX.Core.Shape = { if (label) { label.text(prop); } - break; + break; case ORYX.CONFIG.TYPE_INTEGER: var label = this._labels[refId]; if (label) { @@ -13056,7 +13056,7 @@ ORYX.Core.Shape = { case ORYX.CONFIG.TYPE_FLOAT: if(property.fillOpacity()) { svgElem.setAttributeNS(null, 'fill-opacity', prop); - } + } if(property.strokeOpacity()) { svgElem.setAttributeNS(null, 'stroke-opacity', prop); } @@ -13067,7 +13067,7 @@ ORYX.Core.Shape = { } } break; - + case ORYX.CONFIG.TYPE_FORM_LINK: if (ref == "pimg") { var onclickAttr = svgElem.getAttributeNodeNS('', 'onclick'); @@ -13095,51 +13095,51 @@ ORYX.Core.Shape = { hrefAttr.textContent = prop; } else { svgElem.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', prop); - } + } break; - + } } }).bind(this)); - - + + } } - + } }).bind(this)); - + //update labels this._labels.values().each(function(label) { label.update(); }); } }, - + layout: function() { //this.getStencil().layout(this) var layoutEvents = this.getStencil().layout() if (layoutEvents) { layoutEvents.each(function(event) { - + // setup additional attributes event.shape = this; event.forceExecution = true; - + // do layouting this._delegateEvent(event); }.bind(this)) - + } }, - + /** * Returns an array of Label objects. */ getLabels: function() { return this._labels.values(); }, - + /** * Returns the label for a given ref * @return {ORYX.Core.Label} Returns null if there is no label @@ -13152,10 +13152,10 @@ ORYX.Core.Shape = { return o.key.endsWith(ref); })||{}).value || null; }, - + /** * Hides all related labels - * + * */ hideLabels: function(){ this.getLabels().invoke("hide"); @@ -13163,7 +13163,7 @@ ORYX.Core.Shape = { /** * Shows all related labels - * + * */ showLabels: function(){ var labels = this.getLabels(); @@ -13172,11 +13172,11 @@ ORYX.Core.Shape = { label.update(); }); }, - + setOpacity: function(value, animate){ - + value = Math.max(Math.min((typeof value == "number" ? value : 1.0), 1.0), 0.0); - + if (value !== 1.0){ value = String(value); this.node.setAttributeNS(null, "fill-opacity", value) @@ -13186,18 +13186,18 @@ ORYX.Core.Shape = { this.node.removeAttributeNS(null, "stroke-opacity"); } }, - + /** * Returns an array of dockers of this object. */ getDockers: function() { return this.dockers; }, - + getMagnets: function() { return this.magnets; }, - + getDefaultMagnet: function() { if(this._defaultMagnet) { return this._defaultMagnet; @@ -13211,14 +13211,14 @@ ORYX.Core.Shape = { getParentShape: function() { return this.parent; }, - + getIncomingShapes: function(iterator) { if(iterator) { this.incoming.each(iterator); } return this.incoming; }, - + getIncomingNodes: function(iterator) { return this.incoming.select(function(incoming){ var isNode = (incoming instanceof ORYX.Core.Node); @@ -13226,15 +13226,15 @@ ORYX.Core.Shape = { return isNode; }); }, - - + + getOutgoingShapes: function(iterator) { if(iterator) { this.outgoing.each(iterator); } return this.outgoing; }, - + getOutgoingNodes: function(iterator) { return this.outgoing.select(function(out){ var isNode = (out instanceof ORYX.Core.Node); @@ -13242,7 +13242,7 @@ ORYX.Core.Shape = { return isNode; }); }, - + getAllDockedShapes: function(iterator) { var result = this.incoming.concat(this.outgoing); if(iterator) { @@ -13260,9 +13260,9 @@ ORYX.Core.Shape = { return undefined; } }, - + /** - * + * * @param {Object} deep * @param {Object} iterator */ @@ -13277,16 +13277,16 @@ ORYX.Core.Shape = { iterator(uiObject); } result.push(uiObject); - + if(deep && uiObject instanceof ORYX.Core.Shape) { result = result.concat(uiObject.getChildNodes(deep, iterator)); } }); - + return result; } }, - + /** * Overrides the UIObject.add method. Adds uiObject to the correct sub node. * @param {UIObject} uiObject @@ -13295,9 +13295,9 @@ ORYX.Core.Shape = { add: function(uiObject, index, silent) { //parameter has to be an UIObject, but // must not be an Edge. - if(uiObject instanceof ORYX.Core.UIObject + if(uiObject instanceof ORYX.Core.UIObject && !(uiObject instanceof ORYX.Core.Edge)) { - + if (!(this.children.member(uiObject))) { //if uiObject is child of another parent, remove it from that parent. if(uiObject.parent) { @@ -13341,14 +13341,14 @@ ORYX.Core.Shape = { uiObject.node = parent.insertBefore(uiObject.node, parent.childNodes[index]); else uiObject.node = parent.appendChild(uiObject.node); - + this._changed(); //uiObject.bounds.registerCallback(this._changedCallback); - - + + if(this.eventHandlerCallback && silent !== true) this.eventHandlerCallback({type:ORYX.CONFIG.EVENT_SHAPEADDED,shape:uiObject}) - + } else { ORYX.Log.warn("add: ORYX.Core.UIObject is already a child of this object."); @@ -13397,7 +13397,7 @@ ORYX.Core.Shape = { if(this.eventHandlerCallback && silent !== true) this.eventHandlerCallback({type: ORYX.CONFIG.EVENT_SHAPEREMOVED, shape: uiObject, parent: parent}); - + this._changed(); //uiObject.bounds.unregisterCallback(this._changedCallback); } else { @@ -13405,17 +13405,17 @@ ORYX.Core.Shape = { ORYX.Log.warn("remove: ORYX.Core.UIObject is not a child of this object."); } }, - + /** * Calculate the Border Intersection Point between two points * @param {PointA} * @param {PointB} */ getIntersectionPoint: function() { - + var pointAX, pointAY, pointBX, pointBY; - - // Get the the two Points + + // Get the the two Points switch(arguments.length) { case 2: pointAX = arguments[0].x; @@ -13432,14 +13432,14 @@ ORYX.Core.Shape = { default: throw "getIntersectionPoints needs two or four arguments"; } - - - + + + // Defined an include and exclude point var includePointX, includePointY, excludePointX, excludePointY; var bounds = this.absoluteBounds(); - + if(this.isPointIncluded(pointAX, pointAY, bounds)){ includePointX = pointAX; includePointY = pointAY; @@ -13455,30 +13455,30 @@ ORYX.Core.Shape = { excludePointX = pointBX; excludePointY = pointBY; } - + // If there is no inclue or exclude Shape, than return if(!includePointX || !includePointY || !excludePointX || !excludePointY) { return undefined; } var midPointX = 0; - var midPointY = 0; - + var midPointY = 0; + var refPointX, refPointY; - + var minDifferent = 1; // Get the UpperLeft and LowerRight //var ul = bounds.upperLeft(); //var lr = bounds.lowerRight(); - + var i = 0; - + while(true) { - // Calculate the midpoint of the current to points + // Calculate the midpoint of the current to points var midPointX = Math.min(includePointX, excludePointX) + ((Math.max(includePointX, excludePointX) - Math.min(includePointX, excludePointX)) / 2.0); var midPointY = Math.min(includePointY, excludePointY) + ((Math.max(includePointY, excludePointY) - Math.min(includePointY, excludePointY)) / 2.0); - - + + // Set the new midpoint by the means of the include of the bounds if(this.isPointIncluded(midPointX, midPointY, bounds)){ includePointX = midPointX; @@ -13486,33 +13486,33 @@ ORYX.Core.Shape = { } else { excludePointX = midPointX; excludePointY = midPointY; - } - + } + // Calc the length of the line var length = Math.sqrt(Math.pow(includePointX - excludePointX, 2) + Math.pow(includePointY - excludePointY, 2)) // Calc a point one step from the include point refPointX = includePointX + ((excludePointX - includePointX) / length), refPointY = includePointY + ((excludePointY - includePointY) / length) - - + + // If the reference point not in the bounds, break if(!this.isPointIncluded(refPointX, refPointY, bounds)) { break } - - + + } // Return the last includepoint return {x:refPointX , y:refPointY}; }, - - + + /** * Calculate if the point is inside the Shape * @param {PointX} - * @param {PointY} + * @param {PointY} */ isPointIncluded: function(){ return false @@ -13535,7 +13535,7 @@ ORYX.Core.Shape = { } return false }, - + /** * Calculate if the point is over an special offset area * @param {Point} @@ -13543,11 +13543,11 @@ ORYX.Core.Shape = { isPointOverOffset: function(){ return this.isPointIncluded.apply( this , arguments ) }, - + _dockerChanged: function() { }, - + /** * Create a Docker for this Edge * @@ -13559,7 +13559,7 @@ ORYX.Core.Shape = { docker.bounds.centerMoveTo(position); } this.add(docker, index); - + return docker }, @@ -13579,21 +13579,21 @@ ORYX.Core.Shape = { // Add the outgoing shapes this.getOutgoingShapes().each((function(followingShape){ - serializedObject.push({name: 'outgoing', prefix:'raziel', value: '#'+ERDF.__stripHashes(followingShape.resourceId), type: 'resource'}); + serializedObject.push({name: 'outgoing', prefix:'raziel', value: '#'+ERDF.__stripHashes(followingShape.resourceId), type: 'resource'}); }).bind(this)); // Add the parent shape, if the parent not the canvas //if(this.parent instanceof ORYX.Core.Shape){ - serializedObject.push({name: 'parent', prefix:'raziel', value: '#'+ERDF.__stripHashes(this.parent.resourceId), type: 'resource'}); - //} - + serializedObject.push({name: 'parent', prefix:'raziel', value: '#'+ERDF.__stripHashes(this.parent.resourceId), type: 'resource'}); + //} + return serializedObject; }, - - + + deserialize: function(serialize, json){ arguments.callee.$.deserialize.apply(this, arguments); - + // Set the Bounds var bounds = serialize.find(function(ser){ return 'oryx-bounds' === (ser.prefix+"-"+ser.name) }); if (bounds) { @@ -13607,7 +13607,7 @@ ORYX.Core.Shape = { this.bounds.set(parseFloat(b[0]), parseFloat(b[1]), parseFloat(b[2]), parseFloat(b[3])); } } - + if (json && json.labels instanceof Array){ json.labels.each(function(slabel){ var label = this.getLabel(slabel.ref); @@ -13617,10 +13617,10 @@ ORYX.Core.Shape = { }.bind(this)) } }, - + toJSON: function(){ var json = arguments.callee.$.toJSON.apply(this, arguments); - + var labels = [], id = this.id; this._labels.each(function(obj){ var slabel = obj.value.serialize(); @@ -13629,14 +13629,14 @@ ORYX.Core.Shape = { labels.push(slabel); } }); - + if (labels.length > 0){ json.labels = labels; } return json; }, - + /** * Private methods. */ @@ -13660,14 +13660,14 @@ ORYX.Core.Shape = { element.setAttributeNS(null, 'id', this.id + "_" + this.id + "_" + idIndex); idIndex++; } - + // Replace URL in fill attribute var fill = element.getAttributeNS(null, 'fill'); if (fill&&fill.include("url(#")){ fill = fill.replace(/url\(#/g, 'url(#'+this.id); element.setAttributeNS(null, 'fill', fill); } - + if(element.hasChildNodes()) { for(var i = 0; i < element.childNodes.length; i++) { idIndex = this._adjustIds(element.childNodes[i], idIndex); @@ -13701,7 +13701,7 @@ if(!ORYX.Core.Controls) {ORYX.Core.Controls = {};} * @classDescription Abstract base class for all Controls. */ ORYX.Core.Controls.Control = ORYX.Core.UIObject.extend({ - + toString: function() { return "Control " + this.id; } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -13725,7 +13725,7 @@ if(!ORYX.Core.Controls) {ORYX.Core.Controls = {};} * @classDescription Represents a movable docker that can be bound to a shape. Dockers are used * for positioning shape objects. * @extends {Control} - * + * * TODO absoluteXY und absoluteCenterXY von einem Docker liefern falsche Werte!!! */ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ @@ -13734,15 +13734,15 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ */ construct: function() { arguments.callee.$.construct.apply(this, arguments); - + this.isMovable = true; // Enables movability this.bounds.set(0, 0, 16, 16); // Set the bounds - this.referencePoint = undefined; // Refrenzpoint - this._dockedShapeBounds = undefined; + this.referencePoint = undefined; // Refrenzpoint + this._dockedShapeBounds = undefined; this._dockedShape = undefined; this._oldRefPoint1 = undefined; this._oldRefPoint2 = undefined; - + //this.anchors = []; this.anchorLeft; this.anchorRight; @@ -13760,25 +13760,25 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ ['circle', {cx:"8", cy:"8", r:"8", stroke:"none", fill:"none"}], ['circle', {cx:"8", cy:"8", r:"3", stroke:"black", fill:"red", "stroke-width":"1"}] ]); - - // The ReferenzNode reprasentation + + // The ReferenzNode reprasentation this._referencePointNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", - this.node, + this.node, ['g', {"pointer-events":"none"}, ['circle', {cx: this.bounds.upperLeft().x, cy: this.bounds.upperLeft().y, r: 3, fill:"red", "fill-opacity":0.4}]]); // Hide the Docker this.hide(); - + //Add to the EventHandler this.addEventHandlers(this._dockerNode); - // Buffer the Update Callback for un-/register on Event-Handler + // Buffer the Update Callback for un-/register on Event-Handler this._updateCallback = this._changed.bind(this); }, - + update: function() { - // If there have an DockedShape + // If there have an DockedShape if(this._dockedShape) { if(this._dockedShapeBounds && this._dockedShape instanceof ORYX.Core.Node) { // Calc the delta of width and height of the lastBounds and the current Bounds @@ -13787,88 +13787,88 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ if(!dswidth) dswidth = 1; if(!dsheight) - dsheight = 1; + dsheight = 1; var widthDelta = this._dockedShape.bounds.width() / dswidth; var heightDelta = this._dockedShape.bounds.height() / dsheight; - + // If there is an different if(widthDelta !== 1.0 || heightDelta !== 1.0) { // Set the delta this.referencePoint.x *= widthDelta; this.referencePoint.y *= heightDelta; } - + // Clone these bounds - this._dockedShapeBounds = this._dockedShape.bounds.clone(); + this._dockedShapeBounds = this._dockedShape.bounds.clone(); } - + // Get the first and the last Docker of the parent Shape var dockerIndex = this.parent.dockers.indexOf(this) var dock1 = this; - var dock2 = this.parent.dockers.length > 1 ? + var dock2 = this.parent.dockers.length > 1 ? (dockerIndex === 0? // If there is the first element this.parent.dockers[dockerIndex + 1]: // then take the next docker this.parent.dockers[dockerIndex - 1]): // if not, then take the docker before undefined; - - // Calculate the first absolute Refenzpoint - var absoluteReferenzPoint1 = dock1.getDockedShape() ? - dock1.getAbsoluteReferencePoint() : + + // Calculate the first absolute Refenzpoint + var absoluteReferenzPoint1 = dock1.getDockedShape() ? + dock1.getAbsoluteReferencePoint() : dock1.bounds.center(); - // Calculate the last absolute Refenzpoint - var absoluteReferenzPoint2 = dock2 && dock2.getDockedShape() ? - dock2.getAbsoluteReferencePoint() : - dock2 ? + // Calculate the last absolute Refenzpoint + var absoluteReferenzPoint2 = dock2 && dock2.getDockedShape() ? + dock2.getAbsoluteReferencePoint() : + dock2 ? dock2.bounds.center() : undefined; - // If there is no last absolute Referenzpoint + // If there is no last absolute Referenzpoint if(!absoluteReferenzPoint2) { // Calculate from the middle of the DockedShape var center = this._dockedShape.absoluteCenterXY(); - var minDimension = this._dockedShape.bounds.width() * this._dockedShape.bounds.height(); + var minDimension = this._dockedShape.bounds.width() * this._dockedShape.bounds.height(); absoluteReferenzPoint2 = { x: absoluteReferenzPoint1.x + (center.x - absoluteReferenzPoint1.x) * -minDimension, y: absoluteReferenzPoint1.y + (center.y - absoluteReferenzPoint1.y) * -minDimension } } - + var newPoint = undefined; - + /*if (!this._oldRefPoint1 || !this._oldRefPoint2 || absoluteReferenzPoint1.x !== this._oldRefPoint1.x || absoluteReferenzPoint1.y !== this._oldRefPoint1.y || absoluteReferenzPoint2.x !== this._oldRefPoint2.x || absoluteReferenzPoint2.y !== this._oldRefPoint2.y) {*/ - + // Get the new point for the Docker, calucalted by the intersection point of the Shape and the two points newPoint = this._dockedShape.getIntersectionPoint(absoluteReferenzPoint1, absoluteReferenzPoint2); - + // If there is new point, take the referencepoint as the new point if(!newPoint) { newPoint = this.getAbsoluteReferencePoint(); } - + if(this.parent && this.parent.parent) { var grandParentPos = this.parent.parent.absoluteXY(); newPoint.x -= grandParentPos.x; newPoint.y -= grandParentPos.y; } - + // Set the bounds to the new point this.bounds.centerMoveTo(newPoint) - + this._oldRefPoint1 = absoluteReferenzPoint1; this._oldRefPoint2 = absoluteReferenzPoint2; - } + } /*else { newPoint = this.bounds.center(); }*/ - - + + // } - + // Call the super class arguments.callee.$.update.apply(this, arguments); }, @@ -13878,16 +13878,16 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ */ refresh: function() { arguments.callee.$.refresh.apply(this, arguments); - + // Refresh the dockers node var p = this.bounds.upperLeft(); this._dockerNode.setAttributeNS(null, 'transform','translate(' + p.x + ', ' + p.y + ')'); - + // Refresh the referencepoints node p = Object.clone(this.referencePoint); - + if(p && this._dockedShape){ - var upL + var upL if(this.parent instanceof ORYX.Core.Edge) { upL = this._dockedShape.absoluteXY(); } else { @@ -13897,7 +13897,7 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ p.y += upL.y; } else { p = this.bounds.center(); - } + } this._referencePointNode.setAttributeNS(null, 'transform','translate(' + p.x + ', ' + p.y + ')'); }, @@ -13905,24 +13905,24 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ /** * Set the reference point * @param {Object} point - */ + */ setReferencePoint: function(point) { // Set the referencepoint if(this.referencePoint !== point && - (!this.referencePoint || + (!this.referencePoint || !point || - this.referencePoint.x !== point.x || + this.referencePoint.x !== point.x || this.referencePoint.y !== point.y)) { - + this.referencePoint = point; - this._changed(); + this._changed(); } - + // Update directly, because the referencepoint has no influence of the bounds //this.refresh(); }, - + /** * Get the absolute referencepoint */ @@ -13931,13 +13931,13 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ return undefined; } else { var absUL = this._dockedShape.absoluteXY(); - return { + return { x: this.referencePoint.x + absUL.x, y: this.referencePoint.y + absUL.y } } - }, - + }, + /** * Set the docked Shape from the docker * @param {Object} shape @@ -13947,69 +13947,69 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ // If there is an old docked Shape if(this._dockedShape) { this._dockedShape.bounds.unregisterCallback(this._updateCallback) - + // Delete the Shapes from the incoming and outgoing array // If this Docker the incoming of the Shape if(this === this.parent.dockers.first()) { - + this.parent.incoming = this.parent.incoming.without(this._dockedShape); this._dockedShape.outgoing = this._dockedShape.outgoing.without(this.parent); - - // If this Docker the outgoing of the Shape + + // If this Docker the outgoing of the Shape } else if (this === this.parent.dockers.last()){ - + this.parent.outgoing = this.parent.outgoing.without(this._dockedShape); this._dockedShape.incoming = this._dockedShape.incoming.without(this.parent); - + } - + } - + // Set the new Shape this._dockedShape = shape; this._dockedShapeBounds = undefined; var referencePoint = undefined; - + // If there is an Shape, register the updateCallback if there are changes in the shape bounds if(this._dockedShape) { - + // Add the Shapes to the incoming and outgoing array // If this Docker the incoming of the Shape if(this === this.parent.dockers.first()) { - + this.parent.incoming.push(shape); shape.outgoing.push(this.parent); - - // If this Docker the outgoing of the Shape + + // If this Docker the outgoing of the Shape } else if (this === this.parent.dockers.last()){ - + this.parent.outgoing.push(shape); shape.incoming.push(this.parent); - + } - + // Get the bounds and set the new referencepoint var bounds = this.bounds; var absUL = shape.absoluteXY(); - + /*if(shape.parent){ var b = shape.parent.bounds.upperLeft(); absUL.x -= b.x; absUL.y -= b.y; }*/ - + referencePoint = { x: bounds.center().x - absUL.x, y: bounds.center().y - absUL.y - } - + } + this._dockedShapeBounds = this._dockedShape.bounds.clone(); - + this._dockedShape.bounds.registerCallback(this._updateCallback); - + // Set the color of the docker as docked - this.setDockerColor(ORYX.CONFIG.DOCKER_DOCKED_COLOR); + this.setDockerColor(ORYX.CONFIG.DOCKER_DOCKED_COLOR); } else { // Set the color of the docker as undocked this.setDockerColor(ORYX.CONFIG.DOCKER_UNDOCKED_COLOR); @@ -14020,7 +14020,7 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ this._changed(); //this.update(); }, - + /** * Get the docked Shape */ @@ -14034,7 +14034,7 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ isDocked: function() { return !!this._dockedShape; }, - + /** * Set the Color of the Docker * @param {Object} color @@ -14042,11 +14042,11 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ setDockerColor: function(color) { this._dockerNode.lastChild.setAttributeNS(null, "fill", color); }, - + preventHiding: function(prevent){ this._preventHiding = Math.max(0, (this._preventHiding||0) + (prevent ? 1 : -1)); }, - + /** * Hides this UIObject and all its children. */ @@ -14054,35 +14054,35 @@ ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({ if (this._preventHiding){ return false; } - + // Hide docker and reference point this.node.setAttributeNS(null, 'visibility', 'hidden'); this._referencePointNode.setAttributeNS(null, 'visibility', 'hidden'); - + this.children.each(function(uiObj) { - uiObj.hide(); - }); + uiObj.hide(); + }); }, - + /** * Enables visibility of this UIObject and all its children. */ show: function() { // Show docker this.node.setAttributeNS(null, 'visibility', 'visible'); - + // Hide reference point if the connected shape is an edge if (this.getDockedShape() instanceof ORYX.Core.Edge){ this._referencePointNode.setAttributeNS(null, 'visibility', 'hidden'); } else { this._referencePointNode.setAttributeNS(null, 'visibility', 'visible'); } - + this.children.each(function(uiObj) { - uiObj.show(); - }); + uiObj.show(); + }); }, - + toString: function() { return "Docker " + this.id } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -14109,43 +14109,43 @@ if(!ORYX.Core.Controls) {ORYX.Core.Controls = {};} * @extends {Control} */ ORYX.Core.Controls.Magnet = ORYX.Core.Controls.Control.extend({ - + /** * Constructor */ construct: function() { arguments.callee.$.construct.apply(this, arguments); - + //this.anchors = []; this.anchorLeft; this.anchorRight; this.anchorTop; this.anchorBottom; - + this.bounds.set(0, 0, 16, 16); - + //graft magnet's root node into owner's control group. this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ['g', {"pointer-events":"all"}, ['circle', {cx:"8", cy:"8", r:"4", stroke:"none", fill:"red", "fill-opacity":"0.3"}], ]); - + this.hide(); }, - + update: function() { arguments.callee.$.update.apply(this, arguments); - + //this.isChanged = true; }, - - _update: function() { + + _update: function() { arguments.callee.$.update.apply(this, arguments); - + //this.isChanged = true; }, - + refresh: function() { arguments.callee.$.refresh.apply(this, arguments); @@ -14155,15 +14155,15 @@ ORYX.Core.Controls.Magnet = ORYX.Core.Controls.Control.extend({ p.x += parentPos.x; p.y += parentPos.y; }*/ - + this.node.setAttributeNS(null, 'transform','translate(' + p.x + ', ' + p.y + ')'); }, - + show: function() { //this.refresh(); arguments.callee.$.show.apply(this, arguments); }, - + toString: function() { return "Magnet " + this.id; } @@ -14201,48 +14201,48 @@ ORYX.Core.Node = { */ construct: function(options, stencil, facade){ arguments.callee.$.construct.apply(this, arguments); - + this.isSelectable = true; this.isMovable = true; this._dockerUpdated = false; this.facade = facade; - + this._oldBounds = new ORYX.Core.Bounds(); //init bounds with undefined values this._svgShapes = []; //array of all SVGShape objects of // SVG representation - + //TODO vielleicht in shape verschieben? this.minimumSize = undefined; // {width:..., height:...} this.maximumSize = undefined; - + //TODO vielleicht in shape oder uiobject verschieben? // vielleicht sogar isResizable ersetzen? this.isHorizontallyResizable = false; this.isVerticallyResizable = false; - + this.dataId = undefined; - + this._init(this._stencil.view()); this.forcedHeight = -1; }, - + /** * This method checks whether the shape is resized correctly and calls the * super class update method. */ _update: function(){ - + this.dockers.invoke("update"); if (this.isChanged) { var bounds = this.bounds; var oldBounds = this._oldBounds; - + if (this.isResized) { - + var widthDelta = bounds.width() / oldBounds.width(); var heightDelta = bounds.height() / oldBounds.height(); - + //iterate over all relevant svg elements and resize them this._svgShapes.each(function(svgShape){ //adjust width @@ -14253,12 +14253,12 @@ ORYX.Core.Node = { if (svgShape.isVerticallyResizable) { svgShape.height = svgShape.oldHeight * heightDelta; } - + //check, if anchors are set var anchorOffset; var leftIncluded = svgShape.anchorLeft; var rightIncluded = svgShape.anchorRight; - + if (rightIncluded) { anchorOffset = oldBounds.width() - (svgShape.oldX + svgShape.oldWidth); if (leftIncluded) { @@ -14268,17 +14268,17 @@ ORYX.Core.Node = { svgShape.x = bounds.width() - (anchorOffset + svgShape.width); } } - else + else if (!leftIncluded) { svgShape.x = widthDelta * svgShape.oldX; if (!svgShape.isHorizontallyResizable) { svgShape.x = svgShape.x + svgShape.width * widthDelta / 2 - svgShape.width / 2; } } - + var topIncluded = svgShape.anchorTop; var bottomIncluded = svgShape.anchorBottom; - + if (bottomIncluded) { anchorOffset = oldBounds.height() - (svgShape.oldY + svgShape.oldHeight); if (topIncluded) { @@ -14291,7 +14291,7 @@ ORYX.Core.Node = { } } } - else + else if (!topIncluded) { svgShape.y = heightDelta * svgShape.oldY; if (!svgShape.isVerticallyResizable) { @@ -14299,7 +14299,7 @@ ORYX.Core.Node = { } } }); - + //check, if the current bounds is unallowed horizontally or vertically resized var p = { x: 0, @@ -14314,7 +14314,7 @@ ORYX.Core.Node = { if (p.x !== 0 || p.y !== 0) { bounds.extend(p); } - + //check, if the current bounds are between maximum and minimum bounds p = { x: 0, @@ -14322,7 +14322,7 @@ ORYX.Core.Node = { }; var widthDifference, heightDifference; if (this.minimumSize) { - + ORYX.Log.debug("Shape (%0)'s min size: (%1x%2)", this, this.minimumSize.width, this.minimumSize.height); widthDifference = this.minimumSize.width - bounds.width(); if (widthDifference > 0) { @@ -14334,7 +14334,7 @@ ORYX.Core.Node = { } } if (this.maximumSize) { - + ORYX.Log.debug("Shape (%0)'s max size: (%1x%2)", this, this.maximumSize.width, this.maximumSize.height); widthDifference = bounds.width() - this.maximumSize.width; if (widthDifference > 0) { @@ -14348,49 +14348,49 @@ ORYX.Core.Node = { if (p.x !== 0 || p.y !== 0) { bounds.extend(p); } - + //update magnets - + var widthDelta = bounds.width() / oldBounds.width(); var heightDelta = bounds.height() / oldBounds.height(); - + var leftIncluded, rightIncluded, topIncluded, bottomIncluded, center, newX, newY; - + this.magnets.each(function(magnet){ leftIncluded = magnet.anchorLeft; rightIncluded = magnet.anchorRight; topIncluded = magnet.anchorTop; bottomIncluded = magnet.anchorBottom; - + center = magnet.bounds.center(); - + if (leftIncluded) { newX = center.x; } - else + else if (rightIncluded) { newX = bounds.width() - (oldBounds.width() - center.x) } else { newX = center.x * widthDelta; } - + if (topIncluded) { newY = center.y; } - else + else if (bottomIncluded) { newY = bounds.height() - (oldBounds.height() - center.y); } else { newY = center.y * heightDelta; } - + if (center.x !== newX || center.y !== newY) { magnet.bounds.centerMoveTo(newX, newY); } }); - + //set new position of labels this.getLabels().each(function(label){ // Set the position dependings on it anchor @@ -14408,7 +14408,7 @@ ORYX.Core.Node = { label.setY((label.position?label.position.y:label.y) * heightDelta); } } - + // If there is an position, // set the origin position as well if (label.position){ @@ -14428,7 +14428,7 @@ ORYX.Core.Node = { } } }); - + //update docker var docker = this.dockers[0]; if (docker) { @@ -14437,77 +14437,77 @@ ORYX.Core.Node = { docker.bounds.centerMoveTo(this.bounds.center()); this._dockerUpdated = false; } - + docker.update(); docker.bounds.registerCallback(this._dockerChangedCallback); } this.isResized = false; } - + this.refresh(); - + this.isChanged = false; - + this._oldBounds = this.bounds.clone(); } - + this.children.each(function(value) { if(!(value instanceof ORYX.Core.Controls.Docker)) { value._update(); } }); - + if (this.dockers.length > 0&&!this.dockers.first().getDockedShape()) { this.dockers.each(function(docker){ docker.bounds.centerMoveTo(this.bounds.center()) }.bind(this)) } - + /*this.incoming.each((function(edge) { if(!(this.dockers[0] && this.dockers[0].getDockedShape() instanceof ORYX.Core.Node)) edge._update(true); }).bind(this)); - + this.outgoing.each((function(edge) { if(!(this.dockers[0] && this.dockers[0].getDockedShape() instanceof ORYX.Core.Node)) edge._update(true); }).bind(this)); */ }, - + /** * This method repositions and resizes the SVG representation * of the shape. */ refresh: function(){ arguments.callee.$.refresh.apply(this, arguments); - + /** Movement */ var x = this.bounds.upperLeft().x; var y = this.bounds.upperLeft().y; - + // Move owner element this.node.firstChild.setAttributeNS(null, "transform", "translate(" + x + ", " + y + ")"); // Move magnets this.node.childNodes[1].childNodes[1].setAttributeNS(null, "transform", "translate(" + x + ", " + y + ")"); - + /** Resize */ - + //iterate over all relevant svg elements and update them this._svgShapes.each(function(svgShape){ svgShape.update(); }); }, - + _dockerChanged: function(){ var docker = this.dockers[0]; - + //set the bounds of the the association this.bounds.centerMoveTo(docker.bounds.center()); - + this._dockerUpdated = true; //this._update(true); }, - + /** * This method traverses a tree of SVGElements and returns * all SVGShape objects. For each basic shape or path element @@ -14521,80 +14521,80 @@ ORYX.Core.Node = { try { var svgShape = new ORYX.Core.SVG.SVGShape(svgNode); svgShapes.push(svgShape); - } + } catch (e) { //do nothing } - + if (svgNode.hasChildNodes()) { for (var i = 0; i < svgNode.childNodes.length; i++) { svgShapes = svgShapes.concat(this._initSVGShapes(svgNode.childNodes[i])); } } - + return svgShapes; }, - + /** * Calculate if the point is inside the Shape * @param {PointX} - * @param {PointY} + * @param {PointY} * @param {absoluteBounds} optional: for performance */ isPointIncluded: function(pointX, pointY, absoluteBounds){ // If there is an arguments with the absoluteBounds var absBounds = absoluteBounds && absoluteBounds instanceof ORYX.Core.Bounds ? absoluteBounds : this.absoluteBounds(); - + if (!absBounds.isIncluded(pointX, pointY)) { return false; } else { - + } - - + + //point = Object.clone(point); var ul = absBounds.upperLeft(); var x = pointX - ul.x; - var y = pointY - ul.y; - + var y = pointY - ul.y; + var i=0; do { var isPointIncluded = this._svgShapes[i++].isPointIncluded( x, y ); } while( !isPointIncluded && i < this._svgShapes.length) - + return isPointIncluded; /*return this._svgShapes.any(function(svgShape){ return svgShape.isPointIncluded(point); });*/ }, - - + + /** * Calculate if the point is over an special offset area * @param {Point} */ - isPointOverOffset: function( pointX, pointY ){ + isPointOverOffset: function( pointX, pointY ){ var isOverEl = arguments.callee.$.isPointOverOffset.apply( this , arguments ); - + if (isOverEl) { - + // If there is an arguments with the absoluteBounds var absBounds = this.absoluteBounds(); absBounds.widen( - ORYX.CONFIG.BORDER_OFFSET ); - + if ( !absBounds.isIncluded( pointX, pointY )) { return true; - } + } } - + return false; - + }, - + serialize: function(){ var result = arguments.callee.$.serialize.apply(this); - + // Add the docker's bounds // nodes only have at most one docker! this.dockers.each((function(docker){ @@ -14609,13 +14609,13 @@ ORYX.Core.Node = { }); } }).bind(this)); - + // Get the spezific serialized object from the stencil try { //result = this.getStencil().serialize(this, result); var serializeEvent = this.getStencil().serialize(); - + /* * call serialize callback by reference, result should be found * in serializeEvent.result @@ -14625,27 +14625,27 @@ ORYX.Core.Node = { serializeEvent.data = result; serializeEvent.result = undefined; serializeEvent.forceExecution = true; - + this._delegateEvent(serializeEvent); - + if(serializeEvent.result) { result = serializeEvent.result; } } - } + } catch (e) { } return result; }, - + deserialize: function(data){ arguments.callee.$.deserialize.apply(this, arguments); - + try { //data = this.getStencil().deserialize(this, data); var deserializeEvent = this.getStencil().deserialize(); - + /* * call serialize callback by reference, result should be found * in serializeEventInfo.result @@ -14655,25 +14655,25 @@ ORYX.Core.Node = { deserializeEvent.data = data; deserializeEvent.result = undefined; deserializeEvent.forceExecution = true; - + this._delegateEvent(deserializeEvent); if(deserializeEvent.result) { data = deserializeEvent.result; } } - } + } catch (e) { } - + // Set the outgoing shapes var outgoing = data.findAll(function(ser){ return (ser.prefix+"-"+ser.name) == 'raziel-outgoing'}); outgoing.each((function(obj){ // TODO: Look at Canvas if(!this.parent) {return}; - + // Set outgoing Shape var next = this.getCanvas().getChildShapeByResourceId(obj.value); - + if(next){ if(next instanceof ORYX.Core.Edge) { //Set the first docker of the next shape @@ -14683,16 +14683,16 @@ ORYX.Core.Node = { next.dockers.first().setDockedShape(this); //next.dockers.first().setReferencePoint({x: this.bounds.width() / 2.0, y: this.bounds.height() / 2.0}); } - } - + } + }).bind(this)); - + if (this.dockers.length === 1) { var dockerPos; dockerPos = data.find(function(entry){ return (entry.prefix + "-" + entry.name === "oryx-dockers"); }); - + if (dockerPos) { var points = dockerPos.value.replace(/,/g, " ").split(" ").without("").without("#"); if (points.length === 2 && this.dockers[0].getDockedShape()) { @@ -14707,7 +14707,7 @@ ORYX.Core.Node = { } } }, - + /** * This method excepts the SVGDoucment that is the SVG representation * of this shape. @@ -14718,31 +14718,31 @@ ORYX.Core.Node = { */ _init: function(svgDocument){ arguments.callee.$._init.apply(this, arguments); - + var svgNode = svgDocument.getElementsByTagName("g")[0]; //outer most g node // set all required attributes var attributeTitle = svgDocument.ownerDocument.createAttribute("title"); attributeTitle.nodeValue = this.getStencil().title(); svgNode.setAttributeNode(attributeTitle); - + var attributeId = svgDocument.ownerDocument.createAttribute("id"); attributeId.nodeValue = this.id; svgNode.setAttributeNode(attributeId); - - // + + // var stencilTargetNode = this.node.childNodes[0].childNodes[0]; //" svgNode = stencilTargetNode.appendChild(svgNode); - + // Add to the EventHandler this.addEventHandlers(svgNode.parentNode); - + /**set minimum and maximum size*/ var minSizeAttr = svgNode.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "minimumSize"); if (minSizeAttr) { minSizeAttr = minSizeAttr.replace("/,/g", " "); var minSizeValues = minSizeAttr.split(" "); minSizeValues = minSizeValues.without(""); - + if (minSizeValues.length > 1) { this.minimumSize = { width: parseFloat(minSizeValues[0]), @@ -14757,13 +14757,13 @@ ORYX.Core.Node = { }; } } - + var maxSizeAttr = svgNode.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "maximumSize"); if (maxSizeAttr) { maxSizeAttr = maxSizeAttr.replace("/,/g", " "); var maxSizeValues = maxSizeAttr.split(" "); maxSizeValues = maxSizeValues.without(""); - + if (maxSizeValues.length > 1) { this.maximumSize = { width: parseFloat(maxSizeValues[0]), @@ -14771,19 +14771,19 @@ ORYX.Core.Node = { }; } } - + if (this.minimumSize && this.maximumSize && (this.minimumSize.width > this.maximumSize.width || this.minimumSize.height > this.maximumSize.height)) { - + //TODO wird verschluckt!!! throw this + ": Minimum Size must be greater than maxiumSize."; } - + /**get current bounds and adjust it to upperLeft == (0,0)*/ //initialize all SVGShape objects this._svgShapes = this._initSVGShapes(svgNode); - + //get upperLeft and lowerRight of stencil var upperLeft = { x: undefined, @@ -14799,7 +14799,7 @@ ORYX.Core.Node = { upperLeft.y = (upperLeft.y !== undefined) ? Math.min(upperLeft.y, svgShape.y) : svgShape.y; lowerRight.x = (lowerRight.x !== undefined) ? Math.max(lowerRight.x, svgShape.x + svgShape.width) : svgShape.x + svgShape.width; lowerRight.y = (lowerRight.y !== undefined) ? Math.max(lowerRight.y, svgShape.y + svgShape.height) : svgShape.y + svgShape.height; - + /** set if resizing is enabled */ //TODO isResizable durch die beiden anderen booleans ersetzen? if (svgShape.isHorizontallyResizable) { @@ -14819,24 +14819,24 @@ ORYX.Core.Node = { me.isResizable = true; } }); - + //move all SVGShapes by -upperLeft this._svgShapes.each(function(svgShape){ svgShape.x -= upperLeft.x; svgShape.y -= upperLeft.y; svgShape.update(); }); - + //set bounds of shape //the offsets are also needed for positioning the magnets and the docker var offsetX = upperLeft.x; var offsetY = upperLeft.y; - + lowerRight.x -= offsetX; lowerRight.y -= offsetY; upperLeft.x = 0; upperLeft.y = 0; - + //prevent that width or height of initial bounds is 0 if (lowerRight.x === 0) { lowerRight.x = 1; @@ -14844,18 +14844,18 @@ ORYX.Core.Node = { if (lowerRight.y === 0) { lowerRight.y = 1; } - + this._oldBounds.set(upperLeft, lowerRight); this.bounds.set(upperLeft, lowerRight); - + /**initialize magnets */ - + var magnets = svgDocument.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "magnets"); - + if (magnets && magnets.length > 0) { - + magnets = $A(magnets[0].getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "magnet")); - + var me = this; magnets.each(function(magnetElem){ var magnet = new ORYX.Core.Controls.Magnet({ @@ -14867,7 +14867,7 @@ ORYX.Core.Node = { x: cx - offsetX, y: cy - offsetY }); - + //get anchors var anchors = magnetElem.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors"); if (anchors) { @@ -14890,9 +14890,9 @@ ORYX.Core.Node = { } } } - + me.add(magnet); - + //check, if magnet is default magnet if (!this._defaultMagnet) { var defaultAttr = magnetElem.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "default"); @@ -14903,15 +14903,15 @@ ORYX.Core.Node = { }); } else { - // Add a Magnet in the Center of Shape + // Add a Magnet in the Center of Shape var magnet = new ORYX.Core.Controls.Magnet(); magnet.bounds.centerMoveTo(this.bounds.width() / 2, this.bounds.height() / 2); this.add(magnet); } - + /**initialize docker */ var dockerElem = svgDocument.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "docker"); - + if (dockerElem && dockerElem.length > 0) { dockerElem = dockerElem[0]; var docker = this.createDocker(); @@ -14921,13 +14921,13 @@ ORYX.Core.Node = { x: cx - offsetX, y: cy - offsetY }); - + //get anchors var anchors = dockerElem.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors"); if (anchors) { anchors = anchors.replace("/,/g", " "); anchors = anchors.split(" ").without(""); - + for(var i = 0; i < anchors.length; i++) { switch(anchors[i].toLowerCase()) { case "left": @@ -14946,7 +14946,7 @@ ORYX.Core.Node = { } } } - + /**initialize labels*/ var textElems = svgNode.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'text'); $A(textElems).each((function(textElem){ @@ -14957,30 +14957,30 @@ ORYX.Core.Node = { label.x -= offsetX; label.y -= offsetY; this._labels[label.id] = label; - + label.registerOnChange(this.layout.bind(this)); - + // Only apply fitting on form-components if(this._stencil.id().indexOf(ORYX.CONFIG.FORM_ELEMENT_ID_PREFIX) == 0) { label.registerOnChange(this.fitToLabels.bind(this)); } - + }).bind(this)); }, - + fitToLabels: function() { var y = 0; - + this.getLabels().each(function(label){ var lr = label.getY() + label.getHeight(); if(lr > y) { y = lr; } }); - + var bounds = this.bounds; var boundsChanged = false; - + if(this.minimumSize) { // Check if y-value exceeds the min-value. If not, stick to this value. var minHeight = this.minimumSize.height; @@ -14995,13 +14995,13 @@ ORYX.Core.Node = { boundsChanged = true; } } - + if(boundsChanged) { // Force facade to re-layout since bounds are changed AFTER layout has been performed if(this.facade.getCanvas() != null) { this.facade.getCanvas().update(); } - + // Re-select if needed to force the select if(this.facade.getSelection().member(this)) { var selectedNow = this.facade.getSelection(); @@ -15010,7 +15010,7 @@ ORYX.Core.Node = { } } }, - + /** * Override the Method, that a docker is not shown * @@ -15018,14 +15018,14 @@ ORYX.Core.Node = { createDocker: function() { var docker = new ORYX.Core.Controls.Docker({eventHandlerCallback: this.eventHandlerCallback}); docker.bounds.registerCallback(this._dockerChangedCallback); - + this.dockers.push( docker ); docker.parent = this; - docker.bounds.registerCallback(this._changedCallback); - - return docker - }, - + docker.bounds.registerCallback(this._changedCallback); + + return docker + }, + toString: function(){ return this._stencil.title() + " " + this.id } @@ -15075,47 +15075,47 @@ ORYX.Core.Edge = { */ construct: function(options, stencil, facade){ arguments.callee.$.construct.apply(this, arguments); - + this.isMovable = true; this.isSelectable = true; - + this._dockerUpdated = false; - + this._markers = new Hash(); //a hash map of SVGMarker objects where keys are the marker ids this._paths = []; this._interactionPaths = []; this._dockersByPath = new Hash(); this._markersByPath = new Hash(); - - /* Data structures to store positioning information of attached child nodes */ + + /* Data structures to store positioning information of attached child nodes */ this.attachedNodePositionData = new Hash(); - + //TODO was muss hier initial erzeugt werden? var stencilNode = this.node.childNodes[0].childNodes[0]; stencilNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", stencilNode, ['g', { "pointer-events": "painted" }]); - + //Add to the EventHandler this.addEventHandlers(stencilNode.parentNode); - - + + this._oldBounds = this.bounds.clone(); - + //load stencil this._init(this._stencil.view()); - + if (stencil instanceof Array) { this.deserialize(stencil); } - + }, - + _update: function(force){ if(this._dockerUpdated || this.isChanged || force) { - + this.dockers.invoke("update"); - + if (false && (this.bounds.width() === 0 || this.bounds.height() === 0)) { var width = this.bounds.width(); var height = this.bounds.height(); @@ -15127,9 +15127,9 @@ ORYX.Core.Edge = { x: width === 0 ? -1 : 0, y: height === 0 ? -1 : 0 }); - + } - + // TODO: Bounds muss abhaengig des Eltern-Shapes gesetzt werden var upL = this.bounds.upperLeft(); var oldUpL = this._oldBounds.upperLeft(); @@ -15139,33 +15139,33 @@ ORYX.Core.Edge = { var diffY = upL.y - oldUpL.y; var diffWidth = (this.bounds.width() / oldWidth) || 1; var diffHeight = (this.bounds.height() / oldHeight) || 1; - + this.dockers.each((function(docker){ // Unregister on BoundsChangedCallback docker.bounds.unregisterCallback(this._dockerChangedCallback); - + // If there is any changes at the edge and is there is not an DockersUpdate // set the new bounds to the docker if (!this._dockerUpdated) { docker.bounds.moveBy(diffX, diffY); - + if (diffWidth !== 1 || diffHeight !== 1) { var relX = docker.bounds.upperLeft().x - upL.x; var relY = docker.bounds.upperLeft().y - upL.y; - + docker.bounds.moveTo(upL.x + relX * diffWidth, upL.y + relY * diffHeight); } } // Do Docker update and register on DockersBoundChange docker.update(); docker.bounds.registerCallback(this._dockerChangedCallback); - + }).bind(this)); - + if (this._dockerUpdated) { var a = this.dockers.first().bounds.center(); var b = this.dockers.first().bounds.center(); - + this.dockers.each((function(docker){ var center = docker.bounds.center(); a.x = Math.min(a.x, center.x); @@ -15173,36 +15173,36 @@ ORYX.Core.Edge = { b.x = Math.max(b.x, center.x); b.y = Math.max(b.y, center.y); }).bind(this)); - + //set the bounds of the the association this.bounds.set(Object.clone(a), Object.clone(b)); } - + upL = this.bounds.upperLeft(); oldUpL = this._oldBounds.upperLeft(); - diffWidth = (this.bounds.width() / (oldWidth||this.bounds.width())); diffHeight = (this.bounds.height() / (oldHeight||this.bounds.height())); + diffWidth = (this.bounds.width() / (oldWidth||this.bounds.width())); diffHeight = (this.bounds.height() / (oldHeight||this.bounds.height())); diffX = upL.x - oldUpL.x; diffY = upL.y - oldUpL.y; - + //reposition labels this.getLabels().each(function(label) { - + if (label.getReferencePoint()){ var ref = label.getReferencePoint(); var from = ref.segment.from, to = ref.segment.to; if (!from || !from.parent || !to || !to.parent) { return; } - + var fromPosition = from.bounds.center(), toPosition = to.bounds.center(); if (fromPosition.x === ref.segment.fromPosition.x && fromPosition.y === ref.segment.fromPosition.y && toPosition.x === ref.segment.toPosition.x && toPosition.y === ref.segment.toPosition.y && !ref.dirty){ return; } - + if (!this.parent.initializingShapes) { var oldDistance = ORYX.Core.Math.getDistanceBetweenTwoPoints(ref.segment.fromPosition, ref.segment.toPosition, ref.intersection); var newIntersection = ORYX.Core.Math.getPointBetweenTwoPoints(fromPosition, toPosition, isNaN(oldDistance) ? 0.5 : oldDistance); - + /** * Set position */ @@ -15210,31 +15210,31 @@ ORYX.Core.Edge = { var oiv = ORYX.Core.Math.getOrthogonalIdentityVector(fromPosition, toPosition); var isHor = Math.abs(oiv.y)===1, isVer = Math.abs(oiv.x)===1; oiv.x *= ref.distance; oiv.y *= ref.distance; // vector * distance - oiv.x += newIntersection.x; oiv.y += newIntersection.y; // vector + the intersection point - var mx = isHor && ref.orientation && (ref.iorientation||ref.orientation).endsWith("r") ? -label.getWidth() : 0; + oiv.x += newIntersection.x; oiv.y += newIntersection.y; // vector + the intersection point + var mx = isHor && ref.orientation && (ref.iorientation||ref.orientation).endsWith("r") ? -label.getWidth() : 0; var my = isVer && ref.orientation && (ref.iorientation||ref.orientation).startsWith("l") ? -label.getHeight()+2 : 0; label.setX(oiv.x+mx); label.setY(oiv.y+my); - + // Update the reference point this.updateReferencePointOfLabel(label, newIntersection, from, to); } else { var oiv = ORYX.Core.Math.getOrthogonalIdentityVector(fromPosition, toPosition); oiv.x *= ref.distance; oiv.y *= ref.distance; // vector * distance - oiv.x += ref.intersection.x; oiv.y += ref.intersection.y; // vector + the intersection point + oiv.x += ref.intersection.x; oiv.y += ref.intersection.y; // vector + the intersection point label.setX(oiv.x); label.setY(oiv.y); - ref.segment.fromPosition = fromPosition; ref.segment.toPosition = toPosition; + ref.segment.fromPosition = fromPosition; ref.segment.toPosition = toPosition; } - - return; + + return; } - + // Update label position if no reference point is set if (label.position && !this.parent.initializingShapes){ var x = label.position.x + (diffX * (diffWidth||1)); if (x > this.bounds.lowerRight().x){ x += this.bounds.width()-(this.bounds.width()/(diffWidth||1)); } - + var y = label.position.y + (diffY * (diffHeight||1)); if (y > this.bounds.lowerRight().y){ y += this.bounds.height()-(this.bounds.height()/(diffHeight||1)); @@ -15242,12 +15242,12 @@ ORYX.Core.Edge = { label.setX(x);label.setY(y); return; } - + switch (label.getEdgePosition()) { case "starttop": var angle = this._getAngle(this.dockers[0], this.dockers[1]); var pos = this.dockers.first().bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("left"); label.verticalAlign("bottom"); @@ -15261,13 +15261,13 @@ ORYX.Core.Edge = { label.y = pos.y - label.getOffsetTop(); label.rotate(180 - angle, pos); } - + break; case "startmiddle": var angle = this._getAngle(this.dockers[0], this.dockers[1]); var pos = this.dockers.first().bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("left"); label.verticalAlign("bottom"); @@ -15281,13 +15281,13 @@ ORYX.Core.Edge = { label.y = pos.y + 4; label.rotate(180 - angle, pos); } - + break; - + case "startbottom": var angle = this._getAngle(this.dockers[0], this.dockers[1]); var pos = this.dockers.first().bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("left"); label.verticalAlign("top"); @@ -15301,7 +15301,7 @@ ORYX.Core.Edge = { label.y = pos.y + label.getOffsetBottom(); label.rotate(180 - angle, pos); } - + break; case "midtop": var numOfDockers = this.dockers.length; @@ -15310,12 +15310,12 @@ ORYX.Core.Edge = { var pos1 = this.dockers[numOfDockers/2-1].bounds.center(); var pos2 = this.dockers[numOfDockers/2].bounds.center(); var pos = {x:(pos1.x + pos2.x)/2.0, y:(pos1.y+pos2.y)/2.0}; - + label.horizontalAlign("center"); label.verticalAlign("bottom"); label.x = pos.x; label.y = pos.y - label.getOffsetTop(); - + if (angle <= 90 || angle > 270) { label.rotate(360 - angle, pos); } else { @@ -15325,7 +15325,7 @@ ORYX.Core.Edge = { var index = parseInt(numOfDockers/2); var angle = this._getAngle(this.dockers[index], this.dockers[index+1]) var pos = this.dockers[index].bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("left"); label.verticalAlign("bottom"); @@ -15340,7 +15340,7 @@ ORYX.Core.Edge = { label.rotate(180 - angle, pos); } } - + break; case "midbottom": var numOfDockers = this.dockers.length; @@ -15349,12 +15349,12 @@ ORYX.Core.Edge = { var pos1 = this.dockers[numOfDockers/2-1].bounds.center(); var pos2 = this.dockers[numOfDockers/2].bounds.center(); var pos = {x:(pos1.x + pos2.x)/2.0, y:(pos1.y+pos2.y)/2.0}; - + label.horizontalAlign("center"); label.verticalAlign("top"); label.x = pos.x; label.y = pos.y + label.getOffsetTop(); - + if (angle <= 90 || angle > 270) { label.rotate(360 - angle, pos); } else { @@ -15364,7 +15364,7 @@ ORYX.Core.Edge = { var index = parseInt(numOfDockers/2); var angle = this._getAngle(this.dockers[index], this.dockers[index+1]) var pos = this.dockers[index].bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("left"); label.verticalAlign("top"); @@ -15379,13 +15379,13 @@ ORYX.Core.Edge = { label.rotate(180 - angle, pos); } } - + break; case "endtop": var length = this.dockers.length; var angle = this._getAngle(this.dockers[length-2], this.dockers[length-1]); var pos = this.dockers.last().bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("right"); label.verticalAlign("bottom"); @@ -15399,13 +15399,13 @@ ORYX.Core.Edge = { label.y = pos.y - label.getOffsetTop(); label.rotate(180 - angle, pos); } - + break; case "endbottom": var length = this.dockers.length; var angle = this._getAngle(this.dockers[length-2], this.dockers[length-1]); var pos = this.dockers.last().bounds.center(); - + if (angle <= 90 || angle > 270) { label.horizontalAlign("right"); label.verticalAlign("top"); @@ -15419,38 +15419,38 @@ ORYX.Core.Edge = { label.y = pos.y + label.getOffsetBottom(); label.rotate(180 - angle, pos); } - + break; } }.bind(this)); - + this.children.each(function(value) { if(value instanceof ORYX.Core.Node) { this.calculatePositionOfAttachedChildNode.call(this, value); } }.bind(this)); - + this.refreshAttachedNodes(); this.refresh(); - + this.isChanged = false; this._dockerUpdated = false; - + this._oldBounds = this.bounds.clone(); } - - + + // IE10 specific fix, start and end-markes get left behind when moving path var userAgent = navigator.userAgent; - if (navigator.appVersion.indexOf("MSIE 10") !== -1 || (userAgent.indexOf('Trident') !== -1 && userAgent.indexOf('rv:11') !== -1)) + if (navigator.appVersion.indexOf("MSIE 10") !== -1 || (userAgent.indexOf('Trident') !== -1 && userAgent.indexOf('rv:11') !== -1)) { this.node.parentNode.insertBefore(this.node, this.node); } }, - + /** * Moves a point to the upperLeft of a node's bounds. - * + * * @param {point} point * The point to move * @param {ORYX.Core.Bounds} bounds @@ -15460,43 +15460,43 @@ ORYX.Core.Edge = { point.x -= bounds.width()/2; point.y -= bounds.height()/2; }, - + /** * Refreshes the visual representation of edge's attached nodes. - */ + */ refreshAttachedNodes: function() { this.attachedNodePositionData.values().each(function(nodeData) { var startPoint = nodeData.segment.docker1.bounds.center(); var endPoint = nodeData.segment.docker2.bounds.center(); this.relativizePoint(startPoint); this.relativizePoint(endPoint); - + var newNodePosition = new Object(); - + /* Calculate new x-coordinate */ - newNodePosition.x = startPoint.x + newNodePosition.x = startPoint.x + nodeData.relativDistanceFromDocker1 * (endPoint.x - startPoint.x); - + /* Calculate new y-coordinate */ - newNodePosition.y = startPoint.y + newNodePosition.y = startPoint.y + nodeData.relativDistanceFromDocker1 * (endPoint.y - startPoint.y); - + /* Convert new position to the upper left of the node */ this.movePointToUpperLeftOfNode(newNodePosition, nodeData.node.bounds); - + /* Move node to its new position */ nodeData.node.bounds.moveTo(newNodePosition); - nodeData.node._update(); - + nodeData.node._update(); + }.bind(this)); }, - + /** - * Calculates the position of an edge's child node. The node is placed on + * Calculates the position of an edge's child node. The node is placed on * the path of the edge. - * + * * @param {node} * The node to calculate the new position * @return {Point} @@ -15507,7 +15507,7 @@ ORYX.Core.Edge = { var position = new Object(); position.x = 0; position.y = 0; - + /* Case: Node was just added */ if(!this.attachedNodePositionData[node.getId()]) { this.attachedNodePositionData[node.getId()] = new Object(); @@ -15519,65 +15519,65 @@ ORYX.Core.Edge = { }else if(node.isChanged) { this.findEdgeSegmentForNode(node); } - - - - }, - - /** + + + + }, + + /** * Finds the appropriate edge segement for a node. * The segment is choosen, which has the smallest distance to the node. - * + * * @param {ORYX.Core.Node} node * The concerning node */ findEdgeSegmentForNode: function(node) { var length = this.dockers.length; var smallestDistance = undefined; - + for(i=1;i 0) { var x = this.bounds.upperLeft().x; var y = this.bounds.upperLeft().y; - + this.node.firstChild.childNodes[1].setAttributeNS(null, "transform", "translate(" + x + ", " + y + ")"); } - + }, - + /** * Calculate the Border Intersection Point between two points * @param {PointA} * @param {PointB} */ getIntersectionPoint: function(){ - + var length = Math.floor(this.dockers.length / 2) - + return ORYX.Core.Math.midPoint(this.dockers[length - 1].bounds.center(), this.dockers[length].bounds.center()) }, - + /** * Returns TRUE if the bounds is over the edge * @param {Bounds} @@ -15756,48 +15756,48 @@ ORYX.Core.Edge = { if (i == size-1){ return false; } var a = docker.bounds.center(); var b = dockers[i+1].bounds.center(); - + return ORYX.Core.Math.isRectOverLine(a.x, a.y, b.x, b.y, bounds.a.x, bounds.a.y, bounds.b.x, bounds.b.y); }); }, - + /** * Calculate if the point is inside the Shape * @param {PointX} - * @param {PointY} + * @param {PointY} */ isPointIncluded: function(pointX, pointY){ - - var isbetweenAB = this.absoluteBounds().isIncluded(pointX, pointY, + + var isbetweenAB = this.absoluteBounds().isIncluded(pointX, pointY, ORYX.CONFIG.OFFSET_EDGE_BOUNDS); - + var isPointIncluded = undefined; - + if (isbetweenAB && this.dockers.length > 0) { - + var i = 0; var point1, point2; - - + + do { - + point1 = this.dockers[i].bounds.center(); point2 = this.dockers[++i].bounds.center(); - - isPointIncluded = ORYX.Core.Math.isPointInLine(pointX, pointY, - point1.x, point1.y, - point2.x, point2.y, + + isPointIncluded = ORYX.Core.Math.isPointInLine(pointX, pointY, + point1.x, point1.y, + point2.x, point2.y, ORYX.CONFIG.OFFSET_EDGE_BOUNDS); - + } while (!isPointIncluded && i < this.dockers.length - 1) - + } - + return isPointIncluded; }, - - + + /** * Calculate if the point is over an special offset area * @param {Point} @@ -15805,7 +15805,7 @@ ORYX.Core.Edge = { isPointOverOffset: function(){ return false }, - + /** * Returns TRUE if the given node * is a child node of the shapes node @@ -15814,13 +15814,13 @@ ORYX.Core.Edge = { * */ containsNode: function(node){ - if (this._paths.include(node) || + if (this._paths.include(node) || this._interactionPaths.include(node)){ - return true; - } + return true; + } return false; }, - + /** * Returns the angle of the line between two dockers * (0 - 359.99999999) @@ -15828,104 +15828,104 @@ ORYX.Core.Edge = { _getAngle: function(docker1, docker2) { var p1 = docker1 instanceof ORYX.Core.Controls.Docker ? docker1.absoluteCenterXY() : docker1; var p2 = docker2 instanceof ORYX.Core.Controls.Docker ? docker2.absoluteCenterXY() : docker2; - + return ORYX.Core.Math.getAngle(p1, p2); }, - + alignDockers: function(){ this._update(true); - + var firstPoint = this.dockers.first().bounds.center(); var lastPoint = this.dockers.last().bounds.center(); - + var deltaX = lastPoint.x - firstPoint.x; var deltaY = lastPoint.y - firstPoint.y; - + var numOfDockers = this.dockers.length - 1; - + this.dockers.each((function(docker, index){ var part = index / numOfDockers; docker.bounds.unregisterCallback(this._dockerChangedCallback); docker.bounds.moveTo(firstPoint.x + part * deltaX, firstPoint.y + part * deltaY); docker.bounds.registerCallback(this._dockerChangedCallback); }).bind(this)); - + this._dockerChanged(); }, - + add: function(shape){ arguments.callee.$.add.apply(this, arguments); - + // If the new shape is a Docker which is not contained if (shape instanceof ORYX.Core.Controls.Docker && this.dockers.include(shape)){ - // Add it to the dockers list ordered by paths + // Add it to the dockers list ordered by paths var pathArray = this._dockersByPath.values()[0]; if (pathArray) { pathArray.splice(this.dockers.indexOf(shape), 0, shape); } - + /* Perform nessary adjustments on the edge's child shapes */ this.handleChildShapesAfterAddDocker(shape); } }, - + /** * Performs nessary adjustments on the edge's child shapes. - * + * * @param {ORYX.Core.Controls.Docker} docker * The added docker */ handleChildShapesAfterAddDocker: function(docker) { /* Ensure type of Docker */ if(!docker instanceof ORYX.Core.Controls.Docker) {return undefined;} - + var index = this.dockers.indexOf(docker); if(!(0 < index && index < this.dockers.length - 1)) { /* Exception: Expect added docker between first and last node of the edge */ return undefined; - } - + } + /* Get child nodes concerning the segment of the new docker */ var startDocker = this.dockers[index-1]; var endDocker = this.dockers[index+1]; - + /* Adjust the position of edge's child nodes */ - var segmentElements = + var segmentElements = this.getAttachedNodePositionDataForSegment(startDocker, endDocker); - + var lengthSegmentPart1 = ORYX.Core.Math.getDistancePointToPoint( startDocker.bounds.center(), docker.bounds.center()); var lengthSegmentPart2 = ORYX.Core.Math.getDistancePointToPoint( endDocker.bounds.center(), docker.bounds.center()); - + if(!(lengthSegmentPart1 + lengthSegmentPart2)) {return;} - + var relativDockerPosition = lengthSegmentPart1 / (lengthSegmentPart1 + lengthSegmentPart2); - + segmentElements.each(function(nodePositionData) { /* Assign child node to the new segment */ if(nodePositionData.value.relativDistanceFromDocker1 < relativDockerPosition) { /* Case: before added Docker */ nodePositionData.value.segment.docker2 = docker; - nodePositionData.value.relativDistanceFromDocker1 = + nodePositionData.value.relativDistanceFromDocker1 = nodePositionData.value.relativDistanceFromDocker1 / relativDockerPosition; } else { /* Case: after added Docker */ nodePositionData.value.segment.docker1 = docker; var newFullDistance = 1 - relativDockerPosition; - var relativPartOfSegment = + var relativPartOfSegment = nodePositionData.value.relativDistanceFromDocker1 - relativDockerPosition; - - nodePositionData.value.relativDistanceFromDocker1 = + + nodePositionData.value.relativDistanceFromDocker1 = relativPartOfSegment / newFullDistance; - + } }) - - + + // Update all labels reference points this.getLabels().each(function(label){ @@ -15935,16 +15935,16 @@ ORYX.Core.Edge = { } var index = this.dockers.indexOf(docker); if (index >= ref.segment.fromIndex && index <= ref.segment.toIndex){ - + var segment = this.findSegment(ref.intersection); - if (!segment){ + if (!segment){ // Choose whether the first of the last segment - segment.fromDocker = ref.segment.fromIndex >= (this.dockers.length/2) ? this.dockers[0] : this.dockers[this.dockers.length-2]; + segment.fromDocker = ref.segment.fromIndex >= (this.dockers.length/2) ? this.dockers[0] : this.dockers[this.dockers.length-2]; segment.toDocker = this.dockers[this.dockers.indexOf(from)+1]; // The next one if the to docker } - + var fromPosition = segment.fromDocker.bounds.center(), toPosition = segment.toDocker.bounds.center(); - + var intersection = ORYX.Core.Math.getPointOfIntersectionPointLine( fromPosition, // P1 - Center of the first docker toPosition, // P2 - Center of the second docker @@ -15952,71 +15952,71 @@ ORYX.Core.Edge = { true); //var oldDistance = ORYX.Core.Math.getDistanceBetweenTwoPoints(ref.segment.fromPosition, ref.segment.toPosition, ref.intersection); //intersection = ORYX.Core.Math.getPointBetweenTwoPoints(fromPosition, toPosition, isNaN(oldDistance) ? 0.5 : (lengthOld*oldDistance)/lengthNew); - + // Update the reference point this.updateReferencePointOfLabel(label, intersection, segment.fromDocker, segment.toDocker, true); } }.bind(this)); - + /* Update attached nodes visual representation */ this.refreshAttachedNodes(); }, - + /** * Returns elements from {@link attachedNodePositiondata} that match the * segement defined by startDocker and endDocker. - * + * * @param {ORYX.Core.Controls.Docker} startDocker * The docker defining the begin of the segment. * @param {ORYX.Core.Controls.Docker} endDocker * The docker defining the begin of the segment. - * + * * @return {Hash} attachedNodePositionData * Child elements matching the segment */ getAttachedNodePositionDataForSegment: function(startDocker, endDocker) { /* Ensure that the segment is defined correctly */ - if(!((startDocker instanceof ORYX.Core.Controls.Docker) + if(!((startDocker instanceof ORYX.Core.Controls.Docker) && (endDocker instanceof ORYX.Core.Controls.Docker))) { return []; } - + /* Get elements of the segment */ - var elementsOfSegment = + var elementsOfSegment = this.attachedNodePositionData.findAll(function(nodePositionData) { return nodePositionData.value.segment.docker1 === startDocker && nodePositionData.value.segment.docker2 === endDocker; }); - + /* Return a Hash in each case */ if(!elementsOfSegment) {return [];} - + return elementsOfSegment; }, - + /** * Removes an edge's child shape */ remove: function(shape) { arguments.callee.$.remove.apply(this, arguments); - + if(this.attachedNodePositionData[shape.getId()]) { delete this.attachedNodePositionData[shape.getId()]; } - + /* Adjust child shapes if neccessary */ if(shape instanceof ORYX.Core.Controls.Docker) { this.handleChildShapesAfterRemoveDocker(shape); } }, - + updateReferencePointOfLabel: function(label, intersection, from, to, dirty){ if (!label.getReferencePoint() || !label.isVisible) { return; } - + var ref = label.getReferencePoint(); - + // if (ref.orientation && ref.orientation !== "ce"){ var angle = this._getAngle(from, to); @@ -16038,7 +16038,7 @@ ORYX.Core.Edge = { label.verticalAlign("top"); } else if (angle > 180 && angle < 270){ label.horizontalAlign("left"); - label.verticalAlign("top"); + label.verticalAlign("top"); } else if (angle == 270){ label.horizontalAlign("left"); label.verticalAlign("top");//ref.orientation == "ll" ? "bottom" : "top"); @@ -16071,12 +16071,12 @@ ORYX.Core.Edge = { } else if (angle > 270 && angle <= 360){ label.horizontalAlign("right"); label.verticalAlign("top"); - } + } } ref.iorientation = ref.iorientation || ref.orientation; ref.orientation = (label.verticalAlign()=="top"?"u":"l") + (label.horizontalAlign()=="left"?"l":"r"); } - + label.setReferencePoint(jQuery.extend({},{ intersection: intersection, segment: { @@ -16092,21 +16092,21 @@ ORYX.Core.Edge = { }, /** * Adjusts the child shapes of an edges after a docker was removed. - * + * * @param{ORYX.Core.Controls.Docker} docker * The removed docker. */ handleChildShapesAfterRemoveDocker: function(docker) { /* Ensure docker type */ if(!(docker instanceof ORYX.Core.Controls.Docker)) {return;} - + this.attachedNodePositionData.each(function(nodePositionData) { if(nodePositionData.value.segment.docker1 === docker) { /* The new start of the segment is the predecessor of docker2. */ var index = this.dockers.indexOf(nodePositionData.value.segment.docker2); if(index == -1) {return;} nodePositionData.value.segment.docker1 = this.dockers[index - 1]; - } + } else if(nodePositionData.value.segment.docker2 === docker) { /* The new end of the segment is the successor of docker1. */ var index = this.dockers.indexOf(nodePositionData.value.segment.docker1); @@ -16114,7 +16114,7 @@ ORYX.Core.Edge = { nodePositionData.value.segment.docker2 = this.dockers[index + 1]; } }.bind(this)); - + // Update all labels reference points this.getLabels().each(function(label){ @@ -16124,13 +16124,13 @@ ORYX.Core.Edge = { } var from = ref.segment.from; var to = ref.segment.to; - - if (from !== docker && to !== docker){ - return; + + if (from !== docker && to !== docker){ + return; } - + var segment = this.findSegment(ref.intersection); - if (!segment){ + if (!segment){ from = segment.fromDocker; to = segment.toDocker; } else { @@ -16138,15 +16138,15 @@ ORYX.Core.Edge = { to = this.dockers[this.dockers.indexOf(from)+1]; } - var intersection = ORYX.Core.Math.getPointOfIntersectionPointLine(from.bounds.center(), to.bounds.center(), ref.intersection, true); + var intersection = ORYX.Core.Math.getPointOfIntersectionPointLine(from.bounds.center(), to.bounds.center(), ref.intersection, true); // Update the reference point this.updateReferencePointOfLabel(label, intersection, from, to, true); }.bind(this)); - + /* Update attached nodes visual representation */ this.refreshAttachedNodes(); }, - + /** *@deprecated Use the .createDocker() Method and set the point via the bounds */ @@ -16162,7 +16162,7 @@ ORYX.Core.Edge = { else { var point1 = lastDocker.bounds.center(); var point2 = docker.bounds.center(); - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -16174,12 +16174,12 @@ ORYX.Core.Edge = { } } } - + if (additionalIEZoom !== 1) { position.x = position.x / additionalIEZoom; position.y = position.y / additionalIEZoom; } - + if (ORYX.Core.Math.isPointInLine(position.x, position.y, point1.x, point1.y, point2.x, point2.y, 10)) { var path = this._paths.find(function(path){ return path.id === pair.key; @@ -16190,7 +16190,7 @@ ORYX.Core.Edge = { return true; } } - + var newDocker = (exDocker) ? exDocker : this.createDocker(this.dockers.indexOf(lastDocker) + 1, position); newDocker.bounds.centerMoveTo(position); if(exDocker) @@ -16207,7 +16207,7 @@ ORYX.Core.Edge = { }).bind(this)); return result; }, - + removeDocker: function(docker){ if (this.dockers.length > 2 && !(this.dockers.first() === docker)) { this._dockersByPath.any((function(pair){ @@ -16227,55 +16227,55 @@ ORYX.Core.Edge = { }).bind(this)); } }, - + /** - * Removes all dockers from the edge which are on + * Removes all dockers from the edge which are on * the line between two dockers - * @return {Object} Removed dockers in an indicied array + * @return {Object} Removed dockers in an indicied array * (key is the removed position of the docker, value is docker themselve) */ removeUnusedDockers:function(){ var marked = $H({}); - + this.dockers.each(function(docker, i){ if (i==0||i==this.dockers.length-1){ return } var previous = this.dockers[i-1]; - + /* Do not consider already removed dockers */ if(marked.values().indexOf(previous) != -1 && this.dockers[i-2]) { previous = this.dockers[i-2]; } var next = this.dockers[i+1]; - + var cp = previous.getDockedShape() && previous.referencePoint ? previous.getAbsoluteReferencePoint() : previous.bounds.center(); var cn = next.getDockedShape() && next.referencePoint ? next.getAbsoluteReferencePoint() : next.bounds.center(); var cd = docker.bounds.center(); - + if (ORYX.Core.Math.isPointInLine(cd.x, cd.y, cp.x, cp.y, cn.x, cn.y, 1)){ marked[i] = docker; } }.bind(this)) - + marked.each(function(docker){ this.removeDocker(docker.value); }.bind(this)) - + if (marked.values().length > 0){ this._update(true); } - + return marked; }, - + /** * Initializes the Edge after loading the SVG representation of the edge. * @param {SVGDocument} svgDocument */ _init: function(svgDocument){ arguments.callee.$._init.apply(this, arguments); - + var minPointX, minPointY, maxPointX, maxPointY; - + //init markers var defs = svgDocument.getElementsByTagNameNS(NAMESPACE_SVG, "defs"); if (defs.length > 0) { @@ -16296,82 +16296,82 @@ ORYX.Core.Edge = { }); me._labels[label.id] = label; }); - } + } catch (e) { } }); } - - + + var gs = svgDocument.getElementsByTagNameNS(NAMESPACE_SVG, "g"); if (gs.length <= 0) { throw "Edge: No g element found."; } var g = gs[0]; - - + + g.setAttributeNS(null, "id", null); - + var isFirst = true; - + $A(g.childNodes).each((function(path, index){ if (ORYX.Editor.checkClassType(path, SVGPathElement)) { path = path.cloneNode(false); - + var pathId = this.id + "_" + index; path.setAttributeNS(null, "id", pathId); this._paths.push(path); - + //check, if markers are set and update the id var markersByThisPath = []; var markerUrl = path.getAttributeNS(null, "marker-start"); - + if (markerUrl && markerUrl !== "") { markerUrl = markerUrl.strip(); markerUrl = markerUrl.replace(/^url\(#/, ''); - + var markerStartId = this.getValidMarkerId(markerUrl); path.setAttributeNS(null, "marker-start", "url(#" + markerStartId + ")"); - + markersByThisPath.push(this._markers[markerStartId]); } - + markerUrl = path.getAttributeNS(null, "marker-mid"); - + if (markerUrl && markerUrl !== "") { markerUrl = markerUrl.strip(); markerUrl = markerUrl.replace(/^url\(#/, ''); var markerMidId = this.getValidMarkerId(markerUrl); path.setAttributeNS(null, "marker-mid", "url(#" + markerMidId + ")"); - + markersByThisPath.push(this._markers[markerMidId]); } - + markerUrl = path.getAttributeNS(null, "marker-end"); - + if (markerUrl && markerUrl !== "") { markerUrl = markerUrl.strip(); - + var markerEndId = this.getValidMarkerId(markerUrl); path.setAttributeNS(null, "marker-end", "url(#" + markerEndId + ")"); - + markersByThisPath.push(this._markers[markerEndId]); } - + this._markersByPath[pathId] = markersByThisPath; - + //init dockers var parser = new PathParser(); var handler = new ORYX.Core.SVG.PointsPathHandler(); parser.setHandler(handler); parser.parsePath(path); - + if (handler.points.length < 4) { throw "Edge: Path has to have two or more points specified."; } - + this._dockersByPath[pathId] = []; - + for (var i = 0; i < handler.points.length; i += 2) { //handler.points.each((function(point, pIndex){ var x = handler.points[i]; @@ -16383,9 +16383,9 @@ ORYX.Core.Edge = { docker.bounds.centerMoveTo(x,y); docker.bounds.registerCallback(this._dockerChangedCallback); this.add(docker, this.dockers.length); - + //this._dockersByPath[pathId].push(docker); - + //calculate minPoint and maxPoint if (minPointX) { minPointX = Math.min(x, minPointX); @@ -16395,7 +16395,7 @@ ORYX.Core.Edge = { minPointX = x; minPointY = y; } - + if (maxPointX) { maxPointX = Math.max(x, maxPointX); maxPointY = Math.max(y, maxPointY); @@ -16410,36 +16410,36 @@ ORYX.Core.Edge = { isFirst = false; } }).bind(this)); - + this.bounds.set(minPointX, minPointY, maxPointX, maxPointY); - + if (false&&(this.bounds.width() === 0 || this.bounds.height() === 0)) { var width = this.bounds.width(); var height = this.bounds.height(); - + this.bounds.extend({ x: width === 0 ? 2 : 0, y: height === 0 ? 2 : 0 }); - + this.bounds.moveBy({ x: width === 0 ? -1 : 0, y: height === 0 ? -1 : 0 }); - + } - + this._oldBounds = this.bounds.clone(); - + //add paths to this.node this._paths.reverse(); var paths = []; this._paths.each((function(path){ paths.push(this.node.childNodes[0].childNodes[0].childNodes[0].appendChild(path)); }).bind(this)); - + this._paths = paths; - + //init interaction path this._paths.each((function(path){ var iPath = path.cloneNode(false); @@ -16452,13 +16452,13 @@ ORYX.Core.Edge = { iPath.setAttributeNS(null, "title", this.getStencil().title()); this._interactionPaths.push(this.node.childNodes[0].childNodes[0].childNodes[0].appendChild(iPath)); }).bind(this)); - + this._paths.reverse(); this._interactionPaths.reverse(); - + /**initialize labels*/ var textElems = svgDocument.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, 'text'); - + $A(textElems).each((function(textElem){ var label = new ORYX.Core.SVG.Label({ textElement: textElem, @@ -16466,25 +16466,25 @@ ORYX.Core.Edge = { }); this.node.childNodes[0].childNodes[0].appendChild(label.node); this._labels[label.id] = label; - + label.registerOnChange(this.layout.bind(this)); - }).bind(this)); - - + }).bind(this)); + + this.propertiesChanged.each(function(pair){ pair.value = true; }); - - + + //if(this.dockers.length == 2) { - - - + + + // } - + //this._update(true); }, - + getValidMarkerId: function(markerUrl) { if(markerUrl.indexOf("url(\"#") >= 0) { // Fix for IE9, additional quotes are added to the 2) { @@ -16733,14 +16733,14 @@ ORYX.Core.Edge = { this.removeDocker(this._dockersByPath[path.id][0]); } } - + var dockersByPath = this._dockersByPath[path.id]; - + if (index === 0) { //set position of first docker var x = parseFloat(values.shift()); var y = parseFloat(values.shift()); - + if (dockersByPath.first().getDockedShape()) { dockersByPath.first().setReferencePoint({ x: x, @@ -16751,11 +16751,11 @@ ORYX.Core.Edge = { dockersByPath.first().bounds.centerMoveTo(x, y); } } - + //set position of last docker y = parseFloat(values.pop()); x = parseFloat(values.pop()); - + if (dockersByPath.last().getDockedShape()) { dockersByPath.last().setReferencePoint({ x: x, @@ -16764,15 +16764,15 @@ ORYX.Core.Edge = { } else { dockersByPath.last().bounds.centerMoveTo(x, y); } - + //add additional dockers for (var i = 0; i < values.length; i++) { x = parseFloat(values[i]); y = parseFloat(values[++i]); - + var newDocker = this.createDocker(); newDocker.bounds.centerMoveTo(x, y); - + //this.dockers = this.dockers.without(newDocker); //this.dockers.splice(this.dockers.indexOf(dockersByPath.last()), 0, newDocker); //dockersByPath.splice(this.dockers.indexOf(dockersByPath.last()), 0, newDocker); @@ -16783,33 +16783,33 @@ ORYX.Core.Edge = { } else { this.alignDockers(); } - + arguments.callee.$.deserialize.apply(this, arguments); - + this._changed(); }, - + toString: function(){ return this.getStencil().title() + " " + this.id; }, - + /** * @return {ORYX.Core.Shape} Returns last docked shape or null. */ getTarget: function(){ return this.dockers.last() ? this.dockers.last().getDockedShape() : null; }, - + /** * @return {ORYX.Core.Shape} Returns the first docked shape or null */ getSource: function() { return this.dockers.first() ? this.dockers.first().getDockedShape() : null; }, - + /** * Checks whether the edge is at least docked to one shape. - * + * * @return {boolean} True if edge is docked */ isDocked: function() { @@ -16822,19 +16822,19 @@ ORYX.Core.Edge = { }); return isDocked; }, - + /** * Calls {@link ORYX.Core.AbstractShape#toJSON} and add a some stencil set information. */ toJSON: function() { var json = arguments.callee.$.toJSON.apply(this, arguments); - + if(this.getTarget()) { json.target = { resourceId: this.getTarget().resourceId }; } - + return json; } }; @@ -16860,42 +16860,42 @@ if(!ORYX.Plugins){ ORYX.Plugins = {} } construct: function() { // Call super class constructor arguments.callee.$.construct.apply(this, arguments); - + [...] }, [...] }); - + @class ORYX.Plugins.AbstractPlugin @constructor Creates a new instance @author Willi Tscheschner */ ORYX.Plugins.AbstractPlugin = Clazz.extend({ - /** + /** * The facade which offer editor-specific functionality * @type Facade * @memberOf ORYX.Plugins.AbstractPlugin.prototype */ facade: null, - + construct: function( facade ){ this.facade = facade; - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADED, this.onLoaded.bind(this)); }, - + /** Overwrite to handle load event. TODO: Document params!!! @methodOf ORYX.Plugins.AbstractPlugin.prototype */ onLoaded: function(){}, - + /** Overwrite to handle selection changed event. TODO: Document params!!! @methodOf ORYX.Plugins.AbstractPlugin.prototype */ onSelectionChanged: function(){}, - + /** Show overlay on given shape. @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -16917,11 +16917,11 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ @param {String} [svgNode="NW"] The svg node position where the overlay should be placed */ showOverlay: function(shapes, attributes, svgNode, svgNodePosition ){ - + if( !(shapes instanceof Array) ){ shapes = [shapes] } - + // Define Shapes shapes = shapes.map(function(shape){ var el = shape; @@ -16931,12 +16931,12 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ } return el; }.bind(this)).compact(); - + // Define unified id if( !this.overlayID ){ this.overlayID = this.type + ORYX.Editor.provideId(); } - + this.facade.raiseEvent({ type : ORYX.CONFIG.EVENT_OVERLAY_SHOW, id : this.overlayID, @@ -16945,9 +16945,9 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ node : svgNode, nodePosition: svgNodePosition || "NW" }); - + }, - + /** Hide current overlay. @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -16956,17 +16956,17 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ this.facade.raiseEvent({ type : ORYX.CONFIG.EVENT_OVERLAY_HIDE, id : this.overlayID - }); + }); }, - + /** Does a transformation with the given xslt stylesheet. @methodOf ORYX.Plugins.AbstractPlugin.prototype @param {String} data The data (e.g. eRDF) which should be transformed @param {String} stylesheet URL of a stylesheet which should be used for transforming data. */ - doTransform: function( data, stylesheet ) { - + doTransform: function( data, stylesheet ) { + if( !stylesheet || !data ){ return "" } @@ -16988,23 +16988,23 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ var domParser = new DOMParser(); var xslObject = domParser.parseFromString(xsl, "text/xml"); xsltProcessor.importStylesheet(xslObject); - + try { - + var newData = xsltProcessor.transformToFragment(parsedData, document); var serializedData = (new XMLSerializer()).serializeToString(newData); - + /* Firefox 2 to 3 problem?! */ serializedData = !serializedData.startsWith("" + serializedData : serializedData; - + return serializedData; - + }catch (error) { return -1; } - + }, - + /** * Opens a new window that shows the given XML content. * @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -17020,7 +17020,7 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ '_blank', "resizable=yes,width=600,height=600,toolbar=0,scrollbars=yes" ); }, - + /** * Opens a download window for downloading the given content. * @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -17034,7 +17034,7 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ win.document.write(""); var submitForm = win.document.createElement("form"); win.document.body.appendChild(submitForm); - + var createHiddenElement = function(name, value) { var newElement = document.createElement("input"); newElement.name=name; @@ -17042,19 +17042,19 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ newElement.value = value; return newElement } - + submitForm.appendChild( createHiddenElement("download", content) ); submitForm.appendChild( createHiddenElement("file", filename) ); - - + + submitForm.method = "POST"; win.document.write(""); win.document.close(); submitForm.action= ORYX.PATH + "/download"; submitForm.submit(); - } + } }, - + /** * Serializes DOM. * @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -17083,10 +17083,10 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ '' + serializedDOM + ''; - + return serializedDOM; }, - + /** * Sets the editor in read only mode: Edges/ dockers cannot be moved anymore, * shapes cannot be selected anymore. @@ -17095,7 +17095,7 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ enableReadOnlyMode: function(){ //Edges cannot be moved anymore this.facade.disableEvent(ORYX.CONFIG.EVENT_MOUSEDOWN); - + // Stop the user from editing the diagram while the plugin is active this._stopSelectionChange = function(){ if(this.facade.getSelection().length > 0) { @@ -17112,13 +17112,13 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ disableReadOnlyMode: function(){ // Edges can be moved now again this.facade.enableEvent(ORYX.CONFIG.EVENT_MOUSEDOWN); - + if (this._stopSelectionChange) { this.facade.unregisterOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, this._stopSelectionChange.bind(this)); this._stopSelectionChange = undefined; } }, - + /** * Extracts RDF from DOM. * @methodOf ORYX.Plugins.AbstractPlugin.prototype @@ -17139,32 +17139,32 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ ORYX.Log.error("XSL load failed" + transport); }).bind(this) }); - + var domParser = new DOMParser(); var xmlObject = domParser.parseFromString(this.getSerializedDOM(), "text/xml"); var xslObject = domParser.parseFromString(xsl, "text/xml"); var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xslObject); var result = xsltProcessor.transformToFragment(xmlObject, document); - + var serializer = new XMLSerializer(); - + return serializer.serializeToString(result); } catch(e){ console.log("error serializing " + e); return ""; } - + }, - + /** * Checks if a certain stencil set is loaded right now. - * + * */ isStencilSetExtensionLoaded: function(stencilSetExtensionNamespace) { return this.facade.getStencilSets().values().any( - function(ss){ + function(ss){ return ss.extensions().keys().any( function(extensionKey) { return extensionKey == stencilSetExtensionNamespace; @@ -17173,10 +17173,10 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ }.bind(this) ); }, - + /** * Raises an event so that registered layouters does - * have the posiblility to layout the given shapes + * have the posiblility to layout the given shapes * For further reading, have a look into the AbstractLayouter * class * @param {Object} shapes @@ -17198,18 +17198,18 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ }); } }, - - + + /** - * Does a primitive layouting with the incoming/outgoing - * edges (set the dockers to the right position) and if - * necessary, it will be called the real layouting + * Does a primitive layouting with the incoming/outgoing + * edges (set the dockers to the right position) and if + * necessary, it will be called the real layouting * @param {ORYX.Core.Node} node * @param {Array} edges */ - layoutEdges : function(node, allEdges, offset){ + layoutEdges : function(node, allEdges, offset){ - if (!this.facade.isExecutingCommands()){ return } + if (!this.facade.isExecutingCommands()){ return } var Command = ORYX.Core.Command.extend({ construct: function(edges, node, offset, plugin){ @@ -17217,15 +17217,15 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ this.node = node; this.plugin = plugin; this.offset = offset; - + // Get the new absolute center var center = node.absoluteXY(); this.ulo = {x: center.x - offset.x, y:center.y - offset.y}; - - + + }, execute: function(){ - + if (this.changes){ this.executeAgain(); return; @@ -17238,7 +17238,7 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ }) }.bind(this)); } - + // Find all edges, which are related to the node and // have more than two dockers this.edges @@ -17246,14 +17246,14 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ .findAll(function(r){ return r.dockers.length > 2 }.bind(this)) // For every edge, check second and one before last docker // if there are horizontal/vertical on the same level - // and if so, align the the bounds + // and if so, align the the bounds .each(function(edge){ if (edge.dockers.first().getDockedShape() === this.node){ var second = edge.dockers[1]; if (this.align(second.bounds, edge.dockers.first())){ second.update(); } } else if (edge.dockers.last().getDockedShape() === this.node) { var beforeLast = edge.dockers[edge.dockers.length-2]; - if (this.align(beforeLast.bounds, edge.dockers.last())){ beforeLast.update(); } + if (this.align(beforeLast.bounds, edge.dockers.last())){ beforeLast.update(); } } edge._update(true); edge.removeUnusedDockers(); @@ -17262,9 +17262,9 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ return; } }.bind(this)); - - - // Find all edges, which have only to dockers + + + // Find all edges, which have only to dockers // and is located horizontal/vertical. // Do layout with those edges this.edges @@ -17279,22 +17279,22 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ } } }.bind(this)); - + this.edges.each(function(edge, i){ this.changes[i].dockerPositions = edge.dockers.map(function(r){ return r.bounds.center() }); }.bind(this)); - + }, /** - * Align the bounds if the center is + * Align the bounds if the center is * the same than the old center * @params {Object} bounds * @params {Object} bounds2 */ align: function(bounds, refDocker){ - + var abRef = refDocker.getAbsoluteReferencePoint() || refDocker.bounds.center(); - + var xdif = bounds.center().x-abRef.x; var ydif = bounds.center().y-abRef.y; if (Math.abs(-Math.abs(xdif) + Math.abs(this.offset.x)) < 3 && this.offset.xs === undefined){ @@ -17303,50 +17303,50 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ if (Math.abs(-Math.abs(ydif) + Math.abs(this.offset.y)) < 3 && this.offset.ys === undefined){ bounds.moveBy({y:-ydif, x:0}) } - + if (this.offset.xs !== undefined || this.offset.ys !== undefined){ var absPXY = refDocker.getDockedShape().absoluteXY(); xdif = bounds.center().x-(absPXY.x+((abRef.x-absPXY.x)/this.offset.xs)); ydif = bounds.center().y-(absPXY.y+((abRef.y-absPXY.y)/this.offset.ys)); - + if (Math.abs(-Math.abs(xdif) + Math.abs(this.offset.x)) < 3){ bounds.moveBy({x:-(bounds.center().x-abRef.x), y:0}) } - + if (Math.abs(-Math.abs(ydif) + Math.abs(this.offset.y)) < 3){ bounds.moveBy({y:-(bounds.center().y-abRef.y), x:0}) } } }, - - /** + + /** * Returns a TRUE if there are bend point which overlay the shape */ isBendPointIncluded: function(edge){ // Get absolute bounds var ab = edge.dockers.first().getDockedShape(); var bb = edge.dockers.last().getDockedShape(); - + if (ab) { ab = ab.absoluteBounds(); ab.widen(5); } - + if (bb) { bb = bb.absoluteBounds(); bb.widen(20); // Wide with 20 because of the arrow from the edge } - + return edge.dockers - .any(function(docker, i){ + .any(function(docker, i){ var c = docker.bounds.center(); // Dont count first and last - return i != 0 && i != edge.dockers.length-1 && + return i != 0 && i != edge.dockers.length-1 && // Check if the point is included to the absolute bounds ((ab && ab.isIncluded(c)) || (bb && bb.isIncluded(c))) }) }, - + removeAllDocker: function(edge){ edge.dockers.slice(1, edge.dockers.length-1).each(function(docker){ edge.removeDocker(docker); @@ -17356,8 +17356,8 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ this.changes.each(function(change){ // Reset the dockers this.removeAllDocker(change.edge); - change.dockerPositions.each(function(pos, i){ - if (i==0||i==change.dockerPositions.length-1){ return } + change.dockerPositions.each(function(pos, i){ + if (i==0||i==change.dockerPositions.length-1){ return } var docker = change.edge.createDocker(undefined, pos); docker.bounds.centerMoveTo(pos); docker.update(); @@ -17365,12 +17365,12 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ change.edge._update(true); }.bind(this)); }, - rollback: function(){ + rollback: function(){ this.changes.each(function(change){ // Reset the dockers this.removeAllDocker(change.edge); - change.oldDockerPositions.each(function(pos, i){ - if (i==0||i==change.oldDockerPositions.length-1){ return } + change.oldDockerPositions.each(function(pos, i){ + if (i==0||i==change.oldDockerPositions.length-1){ return } var docker = change.edge.createDocker(undefined, pos); docker.bounds.centerMoveTo(pos); docker.update(); @@ -17379,7 +17379,7 @@ ORYX.Plugins.AbstractPlugin = Clazz.extend({ }.bind(this)); } }); - + this.facade.executeCommands([new Command(allEdges, node, offset, this)]); } @@ -17398,23 +17398,23 @@ if(!ORYX.Plugins){ ORYX.Plugins = {} } /** This abstract plugin implements the core behaviour of layout - + @class ORYX.Plugins.AbstractLayouter @constructor Creates a new instance @author Willi Tscheschner */ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ - + /** - * 'layouted' defined all types of shapes which will be layouted. + * 'layouted' defined all types of shapes which will be layouted. * It can be one value or an array of values. The value - * can be a Stencil ID (as String) or an class type of either + * can be a Stencil ID (as String) or an class type of either * a ORYX.Core.Node or ORYX.Core.Edge * @type Array|String|Object * @memberOf ORYX.Plugins.AbstractLayouter.prototype */ layouted : [], - + /** * Constructor * @param {Object} facade @@ -17422,10 +17422,10 @@ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ */ construct: function( facade ){ arguments.callee.$.construct.apply(this, arguments); - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LAYOUT, this._initLayout.bind(this)); }, - + /** * Proofs if this shape should be layouted or not * @param {Object} shape @@ -17435,14 +17435,14 @@ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ if (!(this.layouted instanceof Array)){ this.layouted = [this.layouted].compact(); } - + // If there are no elements if (this.layouted.length <= 0) { // Return TRUE return true; } - - // Return TRUE if there is any correlation between + + // Return TRUE if there is any correlation between // the 'layouted' attribute and the shape themselve. return this.layouted.any(function(s){ if (typeof s == "string") { @@ -17452,7 +17452,7 @@ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ } }) }, - + /** * Callback to start the layouting * @param {Object} event Layout event @@ -17460,22 +17460,22 @@ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ * @memberOf ORYX.Plugins.AbstractLayouter.prototype */ _initLayout: function(event){ - + // Get the shapes var shapes = [event.shapes].flatten().compact(); - + // Find all shapes which should be layouted var toLayout = shapes.findAll(function(shape){ - return this.isIncludedInLayout(shape) + return this.isIncludedInLayout(shape) }.bind(this)) - - // If there are shapes left + + // If there are shapes left if (toLayout.length > 0){ // Do layout this.layout(toLayout); } }, - + /** * Implementation of layouting a set on shapes * @param {Object} shapes Given shapes @@ -17494,18 +17494,18 @@ ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if (!ORYX.Plugins) +if (!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.Edit = Clazz.extend({ - + construct: function(facade){ - + this.facade = facade; this.clipboard = new ORYX.Plugins.Edit.ClipBoard(); - + //this.facade.registerOnEvent(ORYX.CONFIG.EVENT_KEYDOWN, this.keyHandler.bind(this)); - + this.facade.offer({ name: ORYX.I18N.Edit.cut, description: ORYX.I18N.Edit.cutDesc, @@ -17521,7 +17521,7 @@ ORYX.Plugins.Edit = Clazz.extend({ index: 1, minShape: 1 }); - + this.facade.offer({ name: ORYX.I18N.Edit.copy, description: ORYX.I18N.Edit.copyDesc, @@ -17537,7 +17537,7 @@ ORYX.Plugins.Edit = Clazz.extend({ index: 2, minShape: 1 }); - + this.facade.offer({ name: ORYX.I18N.Edit.paste, description: ORYX.I18N.Edit.pasteDesc, @@ -17555,7 +17555,7 @@ ORYX.Plugins.Edit = Clazz.extend({ minShape: 0, maxShape: 0 }); - + this.facade.offer({ name: ORYX.I18N.Edit.del, description: ORYX.I18N.Edit.delDesc, @@ -17565,7 +17565,7 @@ ORYX.Plugins.Edit = Clazz.extend({ keyCode: 8, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN }, - { + { keyCode: 46, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } @@ -17576,13 +17576,13 @@ ORYX.Plugins.Edit = Clazz.extend({ minShape: 1 }); }, - + callEdit: function(fn, args){ window.setTimeout(function(){ fn.apply(this, (args instanceof Array ? args : [])); }.bind(this), 1); }, - + /** * Handles the mouse down event and starts the copy-move-paste action, if * control or meta key is pressed. @@ -17596,10 +17596,10 @@ ORYX.Plugins.Edit = Clazz.extend({ this.editPaste(); event.forceExecution = true; this.facade.raiseEvent(event, this.clipboard.shapesAsJson); - + } }, - + /** * The key handler for this plugin. Every action from the set of cut, copy, * paste and delete should be accessible trough simple keyboard shortcuts. @@ -17610,68 +17610,68 @@ ORYX.Plugins.Edit = Clazz.extend({ */ // keyHandler: function(event){ // //TODO document what event.which is. -// +// // ORYX.Log.debug("edit.js handles a keyEvent."); -// +// // // assure we have the current event. -// if (!event) +// if (!event) // event = window.event; -// -// +// +// // // get the currently pressed key and state of control key. // var pressedKey = event.which || event.keyCode; // var ctrlPressed = event.ctrlKey; -// +// // // if the object is to be deleted, do so, and return immediately. // if ((pressedKey == ORYX.CONFIG.KEY_CODE_DELETE) || // ((pressedKey == ORYX.CONFIG.KEY_CODE_BACKSPACE) && // (event.metaKey || event.appleMetaKey))) { -// +// // ORYX.Log.debug("edit.js deletes the shape."); // this.editDelete(); // return; // } -// +// // // if control key is not pressed, we're not interested anymore. // if (!ctrlPressed) // return; -// +// // // when ctrl is pressed, switch trough the possibilities. // switch (pressedKey) { -// +// // // cut. // case ORYX.CONFIG.KEY_CODE_X: // this.editCut(); // break; -// +// // // copy. // case ORYX.CONFIG.KEY_CODE_C: // this.editCopy(); // break; -// +// // // paste. // case ORYX.CONFIG.KEY_CODE_V: // this.editPaste(); // break; // } // }, - + /** * Returns a list of shapes which should be considered while copying. * Besides the shapes of given ones, edges and attached nodes are added to the result set. - * If one of the given shape is a child of another given shape, it is not put into the result. + * If one of the given shape is a child of another given shape, it is not put into the result. */ getAllShapesToConsider: function(shapes){ var shapesToConsider = []; // only top-level shapes var childShapesToConsider = []; // all child shapes of top-level shapes - + shapes.each(function(shape){ //Throw away these shapes which have a parent in given shapes isChildShapeOfAnother = shapes.any(function(s2){ return s2.hasChildShape(shape); }); if(isChildShapeOfAnother) return; - + // This shape should be considered shapesToConsider.push(shape); // Consider attached nodes (e.g. intermediate events) @@ -17680,17 +17680,17 @@ ORYX.Plugins.Edit = Clazz.extend({ attached = attached.findAll(function(a){ return !shapes.include(a) }); shapesToConsider = shapesToConsider.concat(attached); } - + childShapesToConsider = childShapesToConsider.concat(shape.getChildShapes(true)); }.bind(this)); - + // All edges between considered child shapes should be considered // Look for these edges having incoming and outgoing in childShapesToConsider var edgesToConsider = this.facade.getCanvas().getChildEdges().select(function(edge){ // Ignore if already added if(shapesToConsider.include(edge)) return false; // Ignore if there are no docked shapes - if(edge.getAllDockedShapes().size() === 0) return false; + if(edge.getAllDockedShapes().size() === 0) return false; // True if all docked shapes are in considered child shapes return edge.getAllDockedShapes().all(function(shape){ // Remember: Edges can have other edges on outgoing, that is why edges must not be included in childShapesToConsider @@ -17698,10 +17698,10 @@ ORYX.Plugins.Edit = Clazz.extend({ }); }); shapesToConsider = shapesToConsider.concat(edgesToConsider); - + return shapesToConsider; }, - + /** * Performs the cut operation by first copy-ing and then deleting the * current selection. @@ -17709,32 +17709,32 @@ ORYX.Plugins.Edit = Clazz.extend({ editCut: function(){ //TODO document why this returns false. //TODO document what the magic boolean parameters are supposed to do. - + this.editCopy(false, true); this.editDelete(true); return false; }, - + /** * Performs the copy operation. * @param {Object} will_not_update ?? */ editCopy: function( will_update, useNoOffset ){ var selection = this.facade.getSelection(); - + //if the selection is empty, do not remove the previously copied elements if(selection.length == 0) return; - + this.clipboard.refresh(selection, this.getAllShapesToConsider(selection), this.facade.getCanvas().getStencil().stencilSet().namespace(), useNoOffset); if( will_update ) this.facade.updateSelection(); }, - + /** * Performs the paste operation. */ editPaste: function(){ - // Create a new canvas with childShapes + // Create a new canvas with childShapes //and stencilset namespace to be JSON Import conform var canvas = { childShapes: this.clipboard.shapesAsJson, @@ -17744,7 +17744,7 @@ ORYX.Plugins.Edit = Clazz.extend({ }; // Apply json helper to iterate over json object jQuery.extend(canvas, ORYX.Core.AbstractShape.JSONHelper); - + var childShapeResourceIds = canvas.getChildShapes(true).pluck("resourceId"); var outgoings = {}; // Iterate over all shapes @@ -17757,35 +17757,35 @@ ORYX.Plugins.Edit = Clazz.extend({ if (!outgoings[out.resourceId]){ outgoings[out.resourceId] = []; } outgoings[out.resourceId].push(shape); }); - + return shape; }.bind(this), true, true); - + // Iterate over all shapes canvas.eachChild(function(shape, parent){ - + // Check if there has a valid target if(shape.target && !(childShapeResourceIds.include(shape.target.resourceId))){ shape.target = undefined; shape.targetRemoved = true; } - + // Check if the first docker is removed - if( shape.dockers && - shape.dockers.length >= 1 && + if( shape.dockers && + shape.dockers.length >= 1 && shape.dockers[0].getDocker && ((shape.dockers[0].getDocker().getDockedShape() && - !childShapeResourceIds.include(shape.dockers[0].getDocker().getDockedShape().resourceId)) || + !childShapeResourceIds.include(shape.dockers[0].getDocker().getDockedShape().resourceId)) || !shape.getShape().dockers[0].getDockedShape()&&!outgoings[shape.resourceId])) { - + shape.sourceRemoved = true; } - + return shape; }.bind(this), true, true); - + // Iterate over top-level shapes canvas.eachChild(function(shape, parent){ // All top-level shapes should get an offset in their bounds @@ -17813,27 +17813,27 @@ ORYX.Plugins.Edit = Clazz.extend({ docker = docker.getDocker().bounds.center(); } - // If it is the first docker and it has a docked shape, + // If it is the first docker and it has a docked shape, // just return the coordinates - if ((i == 0 && docker.getDocker instanceof Function && - shape.sourceRemoved !== true && (docker.getDocker().getDockedShape() || ((outgoings[shape.resourceId]||[]).length > 0 && (!(shape.getShape() instanceof ORYX.Core.Node) || outgoings[shape.resourceId][0].getShape() instanceof ORYX.Core.Node)))) || - (i == shape.dockers.length - 1 && docker.getDocker instanceof Function && + if ((i == 0 && docker.getDocker instanceof Function && + shape.sourceRemoved !== true && (docker.getDocker().getDockedShape() || ((outgoings[shape.resourceId]||[]).length > 0 && (!(shape.getShape() instanceof ORYX.Core.Node) || outgoings[shape.resourceId][0].getShape() instanceof ORYX.Core.Node)))) || + (i == shape.dockers.length - 1 && docker.getDocker instanceof Function && shape.targetRemoved !== true && (docker.getDocker().getDockedShape() || shape.target))){ - + return { - x: docker.x, + x: docker.x, y: docker.y, getDocker: docker.getDocker } } else if (this.clipboard.useOffset) { return { - x: docker.x + ORYX.CONFIG.COPY_MOVE_OFFSET, + x: docker.x + ORYX.CONFIG.COPY_MOVE_OFFSET, y: docker.y + ORYX.CONFIG.COPY_MOVE_OFFSET, getDocker: docker.getDocker }; } else { return { - x: docker.x, + x: docker.x, y: docker.y, getDocker: docker.getDocker }; @@ -17841,50 +17841,50 @@ ORYX.Plugins.Edit = Clazz.extend({ }.bind(this)); } else if (shape.getShape() instanceof ORYX.Core.Node && shape.dockers && shape.dockers.length > 0 && (!shape.dockers.first().getDocker || shape.sourceRemoved === true || !(shape.dockers.first().getDocker().getDockedShape() || outgoings[shape.resourceId]))){ - + shape.dockers = shape.dockers.map(function(docker, i){ - + if((shape.sourceRemoved === true && i == 0&&docker.getDocker)){ docker = docker.getDocker().bounds.center(); } - + if (this.clipboard.useOffset) { return { - x: docker.x + ORYX.CONFIG.COPY_MOVE_OFFSET, + x: docker.x + ORYX.CONFIG.COPY_MOVE_OFFSET, y: docker.y + ORYX.CONFIG.COPY_MOVE_OFFSET, getDocker: docker.getDocker }; } else { return { - x: docker.x, + x: docker.x, y: docker.y, getDocker: docker.getDocker }; } }.bind(this)); } - + return shape; }.bind(this), false, true); this.clipboard.useOffset = true; this.facade.importJSON(canvas); }, - + /** * Performs the delete operation. No more asking. */ editDelete: function(){ var selection = this.facade.getSelection(); - + var clipboard = new ORYX.Plugins.Edit.ClipBoard(); clipboard.refresh(selection, this.getAllShapesToConsider(selection)); - + var command = new ORYX.Plugins.Edit.DeleteCommand(clipboard , this.facade); - + this.facade.executeCommands([command]); } -}); +}); ORYX.Plugins.Edit.ClipBoard = Clazz.extend({ construct: function(){ @@ -17904,7 +17904,7 @@ ORYX.Plugins.Edit.ClipBoard = Clazz.extend({ this.parents = {}; this.targets = {}; this.useOffset = useNoOffset !== true; - + this.shapesAsJson = shapes.map(function(shape){ var s = shape.toJSON(); s.parent = {resourceId : shape.getParentShape().resourceId}; @@ -17919,7 +17919,7 @@ ORYX.Plugins.Edit.DeleteCommand = ORYX.Core.Command.extend({ this.clipboard = clipboard; this.shapesAsJson = clipboard.shapesAsJson; this.facade = facade; - + // Store dockers of deleted shapes to restore connections this.dockers = this.shapesAsJson.map(function(shapeAsJson) { var shape = shapeAsJson.getShape(); @@ -17934,17 +17934,17 @@ ORYX.Plugins.Edit.DeleteCommand = ORYX.Core.Command.extend({ }); return dockers; }).flatten(); - }, + }, execute: function(){ this.shapesAsJson.each(function(shapeAsJson){ // Delete shape this.facade.deleteShape(shapeAsJson.getShape()); }.bind(this)); - + this.facade.setSelection([]); - this.facade.getCanvas().update(); + this.facade.getCanvas().update(); this.facade.updateSelection(); - + }, rollback: function(){ this.shapesAsJson.each(function(shapeAsJson) { @@ -17952,17 +17952,17 @@ ORYX.Plugins.Edit.DeleteCommand = ORYX.Core.Command.extend({ var parent = this.facade.getCanvas().getChildShapeByResourceId(shapeAsJson.parent.resourceId) || this.facade.getCanvas(); parent.add(shape, shape.parentIndex); }.bind(this)); - + //reconnect shapes this.dockers.each(function(d) { d.object.setDockedShape(d.dockedShape); d.object.setReferencePoint(d.referencePoint); }.bind(this)); - + this.facade.setSelection(this.selectedShapes); - this.facade.getCanvas().update(); + this.facade.getCanvas().update(); this.facade.updateSelection(); - + } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -17982,9 +17982,9 @@ if(!ORYX.Plugins) ORYX.Plugins = new Object(); /** - * The view plugin offers all of zooming functionality accessible over the + * The view plugin offers all of zooming functionality accessible over the * tool bar. This are zoom in, zoom out, zoom to standard, zoom fit to model. - * + * * @class ORYX.Plugins.View * @extends Clazz * @param {Object} facade The editor facade for plugins. @@ -18001,18 +18001,18 @@ ORYX.Plugins.View = { this.minZoomLevel = 0.1; this.maxZoomLevel = 2.5; this.diff=5; //difference between canvas and view port, s.th. like toolbar?? - + //Read properties if (ownPluginData !== undefined && ownPluginData !== null) { - ownPluginData.properties.each( function(property) { - if (property.zoomLevel) {this.zoomLevel = Number(1.0);} + ownPluginData.properties.each( function(property) { + if (property.zoomLevel) {this.zoomLevel = Number(1.0);} if (property.maxFitToScreenLevel) {this.maxFitToScreenLevel=Number(property.maxFitToScreenLevel);} if (property.minZoomLevel) {this.minZoomLevel = Number(property.minZoomLevel);} if (property.maxZoomLevel) {this.maxZoomLevel = Number(property.maxZoomLevel);} }.bind(this)); } - + /* Register zoom in */ this.facade.offer({ 'name':ORYX.I18N.View.zoomIn, @@ -18024,7 +18024,7 @@ ORYX.Plugins.View = { 'minShape': 0, 'maxShape': 0, 'isEnabled': function(){return this.zoomLevel < this.maxZoomLevel }.bind(this)}); - + /* Register zoom out */ this.facade.offer({ 'name':ORYX.I18N.View.zoomOut, @@ -18036,7 +18036,7 @@ ORYX.Plugins.View = { 'minShape': 0, 'maxShape': 0, 'isEnabled': function(){ return this._checkSize() }.bind(this)}); - + /* Register zoom standard */ this.facade.offer({ 'name':ORYX.I18N.View.zoomStandard, @@ -18050,7 +18050,7 @@ ORYX.Plugins.View = { 'maxShape': 0, 'isEnabled': function(){return this.zoomLevel != 1}.bind(this) }); - + /* Register zoom fit to model */ this.facade.offer({ 'name':ORYX.I18N.View.zoomFitToModel, @@ -18063,10 +18063,10 @@ ORYX.Plugins.View = { 'maxShape': 0 }); }, - + /** * It sets the zoom level to a fix value and call the zooming function. - * + * * @param {Number} zoomLevel * the zoom level */ @@ -18075,124 +18075,124 @@ ORYX.Plugins.View = { this._checkZoomLevelRange(); this.zoom(1); }, - + /** - * It does the actual zooming. It changes the viewable size of the canvas + * It does the actual zooming. It changes the viewable size of the canvas * and all to its child elements. - * + * * @param {Number} factor * the factor to adjust the zoom level */ zoom: function(factor) { // TODO: Zoomen auf allen Objekten im SVG-DOM - + this.zoomLevel *= factor; var scrollNode = this.facade.getCanvas().getHTMLContainer().parentNode.parentNode; var canvas = this.facade.getCanvas(); var newWidth = canvas.bounds.width() * this.zoomLevel; var newHeight = canvas.bounds.height() * this.zoomLevel; - + /* Set new top offset */ - var offsetTop = (canvas.node.parentNode.parentNode.parentNode.offsetHeight - newHeight) / 2.0; + var offsetTop = (canvas.node.parentNode.parentNode.parentNode.offsetHeight - newHeight) / 2.0; offsetTop = offsetTop > 20 ? offsetTop - 20 : 0; canvas.node.parentNode.parentNode.style.marginTop = offsetTop + "px"; offsetTop += 5; canvas.getHTMLContainer().style.top = offsetTop + "px"; - + /*readjust scrollbar*/ var newScrollTop= scrollNode.scrollTop - Math.round((canvas.getHTMLContainer().parentNode.getHeight()-newHeight) / 2)+this.diff; var newScrollLeft= scrollNode.scrollLeft - Math.round((canvas.getHTMLContainer().parentNode.getWidth()-newWidth) / 2)+this.diff; - + /* Set new Zoom-Level */ canvas.setSize({width: newWidth, height: newHeight}, true); - + /* Set Scale-Factor */ - canvas.node.setAttributeNS(null, "transform", "scale(" +this.zoomLevel+ ")"); + canvas.node.setAttributeNS(null, "transform", "scale(" +this.zoomLevel+ ")"); /* Refresh the Selection */ this.facade.updateSelection(); scrollNode.scrollTop=newScrollTop; scrollNode.scrollLeft=newScrollLeft; - + /* Update the zoom-level*/ canvas.zoomLevel = this.zoomLevel; }, - - + + /** * It calculates the zoom level to fit whole model into the visible area - * of the canvas. Than the model gets zoomed and the position of the + * of the canvas. Than the model gets zoomed and the position of the * scroll bars are adjusted. - * + * */ zoomFitToModel: function() { - + /* Get the size of the visible area of the canvas */ var scrollNode = this.facade.getCanvas().getHTMLContainer().parentNode.parentNode; var visibleHeight = scrollNode.getHeight() - 30; var visibleWidth = scrollNode.getWidth() - 30; - + var nodes = this.facade.getCanvas().getChildShapes(); - + if(!nodes || nodes.length < 1) { - return false; + return false; } - + /* Calculate size of canvas to fit the model */ var bounds = nodes[0].absoluteBounds().clone(); nodes.each(function(node) { bounds.include(node.absoluteBounds().clone()); }); - - + + /* Set new Zoom Level */ var scaleFactorWidth = visibleWidth / bounds.width(); var scaleFactorHeight = visibleHeight / bounds.height(); - + /* Choose the smaller zoom level to fit the whole model */ var zoomFactor = scaleFactorHeight < scaleFactorWidth ? scaleFactorHeight : scaleFactorWidth; - + /*Test if maximum zoom is reached*/ if(zoomFactor>this.maxFitToScreenLevel){zoomFactor=this.maxFitToScreenLevel} /* Do zooming */ this.setAFixZoomLevel(zoomFactor); - + /* Set scroll bar position */ scrollNode.scrollTop = Math.round(bounds.upperLeft().y * this.zoomLevel) - 5; scrollNode.scrollLeft = Math.round(bounds.upperLeft().x * this.zoomLevel) - 5; - + }, - + /** * It checks if the zoom level is less or equal to the level, which is required * to schow the whole canvas. - * + * * @private */ _checkSize:function(){ var canvasParent=this.facade.getCanvas().getHTMLContainer().parentNode; var minForCanvas= Math.min((canvasParent.parentNode.getWidth()/canvasParent.getWidth()),(canvasParent.parentNode.getHeight()/canvasParent.getHeight())); return 1.05 > minForCanvas; - + }, /** * It checks if the zoom level is included in the definined zoom * level range. - * + * * @private */ _checkZoomLevelRange: function() { /*var canvasParent=this.facade.getCanvas().getHTMLContainer().parentNode; var maxForCanvas= Math.max((canvasParent.parentNode.getWidth()/canvasParent.getWidth()),(canvasParent.parentNode.getHeight()/canvasParent.getHeight())); if(this.zoomLevel > maxForCanvas) { - this.zoomLevel = maxForCanvas; + this.zoomLevel = maxForCanvas; }*/ if(this.zoomLevel < this.minZoomLevel) { - this.zoomLevel = this.minZoomLevel; + this.zoomLevel = this.minZoomLevel; } - + if(this.zoomLevel > this.maxZoomLevel) { - this.zoomLevel = this.maxZoomLevel; + this.zoomLevel = this.maxZoomLevel; } } }; @@ -18244,16 +18244,16 @@ new function() { */ ORYX.Editor.provideId = function() { var res = [], hex = '0123456789ABCDEF'; - + for (var i = 0; i < 36; i++) res[i] = Math.floor(Math.random()*0x10); - + res[14] = 4; res[19] = (res[19] & 0x3) | 0x8; - + for (var i = 0; i < 36; i++) res[i] = hex[res[i]]; - + res[8] = res[13] = res[18] = res[23] = '-'; - + return "sid-" + res.join(''); }; @@ -18283,41 +18283,41 @@ if (!ORYX.Plugins) { ORYX.Plugins.Loading = { construct: function(facade){ - + this.facade = facade; - + // The parent Node this.node = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", this.facade.getCanvas().getHTMLContainer().parentNode, ['div', { 'class': 'LoadingIndicator' }, '']); - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_ENABLE, this.enableLoading.bind(this)); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_DISABLE, this.disableLoading.bind(this)); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_STATUS, this.showStatus.bind(this)); - + this.disableLoading(); }, - + enableLoading: function(options){ - if(options.text) + if(options.text) this.node.innerHTML = options.text + "..."; else this.node.innerHTML = ORYX.I18N.Loading.waiting; this.node.removeClassName('StatusIndicator'); this.node.addClassName('LoadingIndicator'); this.node.style.display = "block"; - + var pos = this.facade.getCanvas().rootNode.parentNode.parentNode.parentNode.parentNode; this.node.style.top = pos.offsetTop + 'px'; this.node.style.left = pos.offsetLeft +'px'; - + }, - + disableLoading: function(){ this.node.style.display = "none"; }, - + showStatus: function(options) { if(options.text) { this.node.innerHTML = options.text; @@ -18329,16 +18329,16 @@ ORYX.Plugins.Loading = { this.node.style.top = pos.offsetTop + 'px'; this.node.style.left = pos.offsetLeft +'px'; - + var tout = options.timeout ? options.timeout : 2000; - + window.setTimeout((function(){ - + this.disableLoading(); - + }).bind(this), tout); } - + } } @@ -18364,24 +18364,24 @@ if (!ORYX.Plugins) { ORYX.Plugins.CanvasResize = Clazz.extend({ construct: function(facade){ - + this.facade = facade; new ORYX.Plugins.CanvasResizeButton( this.facade.getCanvas(), "N", this.resize.bind(this)); new ORYX.Plugins.CanvasResizeButton( this.facade.getCanvas(), "W", this.resize.bind(this)); new ORYX.Plugins.CanvasResizeButton( this.facade.getCanvas(), "E", this.resize.bind(this)); new ORYX.Plugins.CanvasResizeButton( this.facade.getCanvas(), "S", this.resize.bind(this)); - + window.setTimeout(function(){jQuery(window).trigger('resize');}); }, - + resize: function( position, shrink ){ - + resizeCanvas = function(position, extentionSize, facade) { var canvas = facade.getCanvas(); var b = canvas.bounds; var scrollNode = facade.getCanvas().getHTMLContainer().parentNode.parentNode; - + if( position == "E" || position == "W"){ canvas.setSize({width: (b.width() + extentionSize)*canvas.zoomLevel, height: (b.height())*canvas.zoomLevel}) @@ -18390,7 +18390,7 @@ ORYX.Plugins.CanvasResize = Clazz.extend({ } if( position == "N" || position == "W"){ - + var move = position == "N" ? {x: 0, y: extentionSize}: {x: extentionSize, y: 0 }; // Move all children @@ -18404,19 +18404,19 @@ ORYX.Plugins.CanvasResize = Clazz.extend({ } else if( position == "E" ){ scrollNode.scrollLeft += extentionSize; } - + jQuery(window).trigger('resize'); - + canvas.update(); facade.updateSelection(); } - + var commandClass = ORYX.Core.Command.extend({ construct: function(position, extentionSize, facade){ this.position = position; this.extentionSize = extentionSize; this.facade = facade; - }, + }, execute: function(){ resizeCanvas(this.position, this.extentionSize, this.facade); }, @@ -18426,31 +18426,31 @@ ORYX.Plugins.CanvasResize = Clazz.extend({ update:function(){ } }); - + var extentionSize = ORYX.CONFIG.CANVAS_RESIZE_INTERVAL; if(shrink) extentionSize = -extentionSize; var command = new commandClass(position, extentionSize, this.facade); - + this.facade.executeCommands([command]); - + } - + }); ORYX.Plugins.CanvasResizeButton = Clazz.extend({ - + construct: function(canvas, position, callback){ this.canvas = canvas; var parentNode = canvas.getHTMLContainer().parentNode; - + window.myParent=parentNode; - + var actualScrollNode = jQuery('#canvasSection')[0]; var scrollNode = actualScrollNode; var canvasNode = jQuery('#canvasSection').find(".ORYX_Editor")[0]; var svgRootNode = canvasNode.children[0]; - + var iconClass = 'glyphicon glyphicon-chevron-'; var iconClassShrink = 'glyphicon glyphicon-chevron-'; if(position == 'N') { @@ -18466,11 +18466,11 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ iconClass += 'left'; iconClassShrink += 'right'; } - + // The buttons var idGrow = 'canvas-shrink-' + position; var idShrink = 'canvas-grow-' + position; - + var buttonGrow = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", parentNode, ['div', {'class': 'canvas_resize_indicator canvas_resize_indicator_grow' + ' ' + position, 'id': idGrow ,'title':ORYX.I18N.RESIZE.tipGrow+ORYX.I18N.RESIZE[position]}, ['i', {'class' : iconClass}] ]); @@ -18478,42 +18478,42 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ ['i', {'class' : iconClassShrink}] ]); // Defines a callback which gives back - // a boolean if the current mouse event + // a boolean if the current mouse event // is over the particular button area var offSetWidth = 60; var isOverOffset = function(event) { - + var isOverButton = event.target.id.indexOf("canvas-shrink") != -1 || event.target.id.indexOf("canvas-grow") != -1 || event.target.parentNode.id.indexOf("canvas-shrink") != -1 || event.target.parentNode.id.indexOf("canvas-grow") != -1; if(isOverButton) { - if(event.target.id == idGrow || event.target.id == idShrink || + if(event.target.id == idGrow || event.target.id == idShrink || event.target.parentNode.id == idGrow || event.target.parentNode.id == idShrink ) { return true; } else { return false; } } - + if(event.target!=parentNode && event.target!=scrollNode&& event.target!=scrollNode.firstChild&& event.target!=svgRootNode&& event.target!=scrollNode){ return false; } - + //if(inCanvas){offSetWidth=30}else{offSetWidth=30*2} //Safari work around var X=event.offsetX !== undefined ? event.offsetX : event.layerX; var Y=event.offsetY !== undefined ? event.offsetY : event.layerY; - + var canvasOffset = 0; if(canvasNode.clientWidth < actualScrollNode.clientWidth) { var widthDiff = actualScrollNode.clientWidth - canvasNode.clientWidth; canvasOffset = widthDiff / 2; } - + // Adjust to relative location to the actual viewport Y = Y - actualScrollNode.scrollTop; X = X - actualScrollNode.scrollLeft; - - + + if(position == "N"){ return Y < offSetWidth; } else if(position == "W"){ @@ -18523,30 +18523,30 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ } else if(position == "S"){ return actualScrollNode.clientHeight - Y < offSetWidth; } - + return false; }; - + var showButtons = (function() { - buttonGrow.show(); - + buttonGrow.show(); + var w = canvas.bounds.width(); var h = canvas.bounds.height(); - + if(position=="N" && (h - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_HEIGHT)) buttonShrink.show(); else if(position=="E" && (w - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_WIDTH)) buttonShrink.show(); else if(position=="S" && (h - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_HEIGHT)) buttonShrink.show(); else if(position=="W" && (w - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_WIDTH)) buttonShrink.show(); else buttonShrink.hide(); - + }).bind(this); - + var hideButtons = function() { - buttonGrow.hide(); + buttonGrow.hide(); buttonShrink.hide(); }; - + // If the mouse move is over the button area, show the button parentNode.parentNode.addEventListener( ORYX.CONFIG.EVENT_MOUSEMOVE, function(event){ if( isOverOffset(event) ){showButtons();} else {hideButtons()}} , false ); // If the mouse is over the button, show them @@ -18556,7 +18556,7 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ //scrollNode.addEventListener( ORYX.CONFIG.EVENT_MOUSEOUT, function(event){button.hide()}, true ) parentNode.parentNode.addEventListener( ORYX.CONFIG.EVENT_MOUSEOUT, function(event){hideButtons()} , true ); //svgRootNode.addEventListener( ORYX.CONFIG.EVENT_MOUSEOUT, function(event){ inCanvas = false } , true ); - + // Hide the button initialy hideButtons(); @@ -18565,7 +18565,7 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ buttonShrink.addEventListener('click', function(){callback( position, true ); showButtons();}, true); } - + }); @@ -18579,32 +18579,32 @@ ORYX.Plugins.CanvasResizeButton = Clazz.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if (!ORYX.Plugins) +if (!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.RenameShapes = Clazz.extend({ facade: undefined, - + construct: function(facade){ - + this.facade = facade; - - this.facade.registerOnEvent(ORYX.CONFIG.EVENT_CANVAS_SCROLL, this.hideField.bind(this)); - this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DBLCLICK, this.actOnDBLClick.bind(this)); + + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_CANVAS_SCROLL, this.hideField.bind(this)); + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DBLCLICK, this.actOnDBLClick.bind(this)); this.facade.offer({ keyCodes: [{ keyCode: 113, // F2-Key - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.renamePerF2.bind(this) }); - - + + document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEDOWN, this.hide.bind(this), true); }, - + /** * This method handles the "F2" key down event. The selected shape are looked * up and the editing of title/name of it gets started. @@ -18613,39 +18613,39 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ var selectedShapes = this.facade.getSelection(); this.actOnDBLClick(undefined, selectedShapes.first()); }, - + actOnDBLClick: function(evt, shape){ - + if( !(shape instanceof ORYX.Core.Shape) ){ return; } - + // Destroys the old input, if there is one this.destroy(); - + // Get all properties which where at least one ref to view is set - var props = shape.getStencil().properties().findAll(function(item){ - return (item.refToView() + var props = shape.getStencil().properties().findAll(function(item){ + return (item.refToView() && item.refToView().length > 0 - && item.directlyEditable()); + && item.directlyEditable()); }); // from these, get all properties where write access are and the type is String or Expression props = props.findAll(function(item){ return !item.readonly() && (item.type() == ORYX.CONFIG.TYPE_STRING || item.type() == ORYX.CONFIG.TYPE_EXPRESSION || item.type() == ORYX.CONFIG.TYPE_DATASOURCE); }); - + // Get all ref ids var allRefToViews = props.collect(function(prop){ return prop.refToView(); }).flatten().compact(); // Get all labels from the shape with the ref ids var labels = shape.getLabels().findAll(function(label){ return allRefToViews.any(function(toView){ return label.id.endsWith(toView); }); }); - + // If there are no referenced labels --> return - if( labels.length == 0 ){ return; } - + if( labels.length == 0 ){ return; } + // Define the nearest label - var nearestLabel = labels.length <= 1 ? labels[0] : null; + var nearestLabel = labels.length <= 1 ? labels[0] : null; if( !nearestLabel ){ nearestLabel = labels.find(function(label){ return label.node == evt.target || label.node == evt.target.parentNode; }); if( !nearestLabel ){ - + var evtCoord = this.facade.eventCoordinates(evt); - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -18657,7 +18657,7 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ } } } - + if (additionalIEZoom !== 1) { evtCoord.x = evtCoord.x / additionalIEZoom; evtCoord.y = evtCoord.y / additionalIEZoom; @@ -18668,28 +18668,28 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ { evtCoord.y += 61; } - + evtCoord.x -= $("canvasSection").scrollLeft; - + var trans = this.facade.getCanvas().rootNode.lastChild.getScreenCTM(); evtCoord.x *= trans.a; evtCoord.y *= trans.d; - var diff = labels.collect(function(label){ - var center = this.getCenterPosition( label.node ); + var diff = labels.collect(function(label){ + var center = this.getCenterPosition( label.node ); var len = Math.sqrt( Math.pow(center.x - evtCoord.x, 2) + Math.pow(center.y - evtCoord.y, 2)); - return {diff: len, label: label}; + return {diff: len, label: label}; }.bind(this)); - + diff.sort(function(a, b){ return a.diff > b.diff; }); - + nearestLabel = diff[0].label; } } // Get the particular property for the label var prop = props.find(function(item){ return item.refToView().any(function(toView){ return nearestLabel.id == shape.id + toView; });}); - + // Get the center position from the nearest label var width = Math.min(Math.max(100, shape.bounds.width()), 200); var center = this.getCenterPosition( nearestLabel.node, shape ); @@ -18706,13 +18706,13 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ this.oldValueText = shape.properties[propId]; document.getElementById('canvasSection').appendChild(textInput); this.shownTextField = textInput; - - + + // Value change listener needs to be defined now since we reference it in the text field this.updateValueFunction = function(newValue, oldValue) { var currentEl = shape; var facade = this.facade; - + if (oldValue != newValue) { // Implement the specific command for property change var commandClass = ORYX.Core.Command.extend({ @@ -18740,28 +18740,28 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ }); // Instantiated the class var command = new commandClass(); - + // Execute the command this.facade.executeCommands([command]); } }.bind(this); - + jQuery("#shapeTextInput").focus(); - + jQuery("#shapeTextInput").autogrow(); - + // Disable the keydown in the editor (that when hitting the delete button, the shapes not get deleted) this.facade.disableEvent(ORYX.CONFIG.EVENT_KEYDOWN); - + }, - + getCenterPosition: function(svgNode, shape){ - + if (!svgNode) { return {x:0, y:0}; } - + var scale = this.facade.getCanvas().node.getScreenCTM(); var absoluteXY = shape.bounds.upperLeft(); - + var hasParent = true; var searchShape = shape; while (hasParent) @@ -18778,14 +18778,14 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ searchShape = searchShape.getParentShape(); } } - + var center = shape.bounds.midPoint(); center.x += absoluteXY.x + scale.e; center.y += absoluteXY.y + scale.f; - + center.x *= scale.a; center.y *= scale.d; - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -18797,16 +18797,16 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ } } } - + if (additionalIEZoom === 1) { center.y = center.y - jQuery("#canvasSection").offset().top + 5; center.x -= jQuery("#canvasSection").offset().left; - + } else { var canvasOffsetLeft = jQuery("#canvasSection").offset().left; var canvasScrollLeft = jQuery("#canvasSection").scrollLeft(); var canvasScrollTop = jQuery("#canvasSection").scrollTop(); - + var offset = scale.e - (canvasOffsetLeft * additionalIEZoom); var additionaloffset = 0; if (offset > 10) { @@ -18815,11 +18815,11 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ center.y = center.y - (jQuery("#canvasSection").offset().top * additionalIEZoom) + 5 + ((canvasScrollTop * additionalIEZoom) - canvasScrollTop); center.x = center.x - (canvasOffsetLeft * additionalIEZoom) + additionaloffset + ((canvasScrollLeft * additionalIEZoom) - canvasScrollLeft); } - - - return center; + + + return center; }, - + hide: function(e){ if (this.shownTextField && (!e || e.target !== this.shownTextField)) { var newValue = this.shownTextField.value; @@ -18830,19 +18830,19 @@ ORYX.Plugins.RenameShapes = Clazz.extend({ this.destroy(); } }, - + hideField: function(e){ if (this.shownTextField) { this.destroy(); } }, - + destroy: function(e){ var textInputComp = jQuery("#shapeTextInput"); if( textInputComp ){ - textInputComp.remove(); - delete this.shownTextField; - + textInputComp.remove(); + delete this.shownTextField; + this.facade.enableEvent(ORYX.CONFIG.EVENT_KEYDOWN); } } @@ -18862,8 +18862,8 @@ if(!ORYX.Plugins) /** * Supports EPCs by offering a syntax check and export and import ability.. - * - * + * + * */ ORYX.Plugins.ProcessLink = Clazz.extend({ @@ -18871,57 +18871,57 @@ ORYX.Plugins.ProcessLink = Clazz.extend({ /** * Offers the plugin functionality: - * + * */ construct: function(facade) { this.facade = facade; - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_PROPERTY_CHANGED, this.propertyChanged.bind(this) ); - + }, /** - * + * * @param {Object} option */ propertyChanged: function( option, node){ if( option.name !== "oryx-refuri" || !node instanceof ORYX.Core.Node ){ return } - - + + if( option.value && option.value.length > 0 && option.value != "undefined"){ - + this.show( node, option.value ); - + } else { this.hide( node ); - } + } }, - + /** * Shows the Link for a particular shape with a specific url - * + * * @param {Object} shape * @param {Object} url */ show: function( shape, url){ - + // Generate the svg-representation of a link var link = ORYX.Editor.graft("http://www.w3.org/2000/svg", null , [ 'a', {'target': '_blank'}, - ['path', + ['path', { "stroke-width": 1.0, "stroke":"#00DD00", "fill": "#00AA00", "d": "M3,3 l0,-2.5 l7.5,0 l0,-2.5 l7.5,4.5 l-7.5,3.5 l0,-2.5 l-8,0", "line-captions": "round"} ] ]); - var link = ORYX.Editor.graft("http://www.w3.org/2000/svg", null , + var link = ORYX.Editor.graft("http://www.w3.org/2000/svg", null , [ 'a', {'target': '_blank'}, ['path', { "style": "fill:#92BFFC;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72", "d": "M0 1.44 L0 15.05 L11.91 15.05 L11.91 5.98 L7.37 1.44 L0 1.44 Z"}], @@ -18930,7 +18930,7 @@ ORYX.Plugins.ProcessLink = Clazz.extend({ ]); /* - * + * * [ 'a', {'target': '_blank'}, ['path', { "style": "fill:none;stroke-width:0.5px; stroke:#000000", "d": "M7,4 l0,2"}], @@ -18943,25 +18943,25 @@ ORYX.Plugins.ProcessLink = Clazz.extend({ ['rect', { "style": "fill:none;stroke:none;pointer-events:all", "width": 14, "height": 16, "x": 0, "y": 0}] ]); */ - + // Set the link with the special namespace link.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", url); - - - // Shows the link in the overlay + + + // Shows the link in the overlay this.facade.raiseEvent({ type: ORYX.CONFIG.EVENT_OVERLAY_SHOW, id: "arissupport.urlref_" + shape.id, shapes: [shape], node: link, nodePosition: "SE" - }); - - }, + }); + + }, /** * Hides the Link for a particular shape - * + * * @param {Object} shape */ hide: function( shape ){ @@ -18969,9 +18969,9 @@ ORYX.Plugins.ProcessLink = Clazz.extend({ this.facade.raiseEvent({ type: ORYX.CONFIG.EVENT_OVERLAY_HIDE, id: "arissupport.urlref_" + shape.id - }); - - } + }); + + } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * License rights for this program may be obtained from Alfresco Software, Ltd. @@ -18985,7 +18985,7 @@ ORYX.Plugins.ProcessLink = Clazz.extend({ Array.prototype.insertFrom = function(from, to){ to = Math.max(0, to); from = Math.min( Math.max(0, from), this.length-1 ); - + var el = this[from]; var old = this.without(el); var newA = old.slice(0, to); @@ -19007,8 +19007,8 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ this.facade = facade; // Z-Ordering - /** Hide for SIGNAVIO - + /** Hide for SIGNAVIO + this.facade.offer({ 'name':ORYX.I18N.Arrangement.btf, 'functionality': this.setZLevel.bind(this, this.setToTop), @@ -19017,7 +19017,7 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ 'description': ORYX.I18N.Arrangement.btfDesc, 'index': 1, 'minShape': 1}); - + this.facade.offer({ 'name':ORYX.I18N.Arrangement.btb, 'functionality': this.setZLevel.bind(this, this.setToBack), @@ -19085,7 +19085,7 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ 'minShape': 2}); **/ - + this.facade.offer({ 'name':ORYX.I18N.Arrangement.am, 'functionality': this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_MIDDLE]), @@ -19094,7 +19094,7 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ 'description': ORYX.I18N.Arrangement.amDesc, 'index': 1, 'minShape': 2}); - + this.facade.offer({ 'name':ORYX.I18N.Arrangement.ac, 'functionality': this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_CENTER]), @@ -19104,7 +19104,7 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ 'index': 2, 'minShape': 2}); - + this.facade.offer({ 'name':ORYX.I18N.Arrangement.as, 'functionality': this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_SIZE]), @@ -19113,26 +19113,26 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ 'description': ORYX.I18N.Arrangement.asDesc, 'index': 3, 'minShape': 2}); - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_TOP, this.setZLevel.bind(this, this.setToTop) ); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_BACK, this.setZLevel.bind(this, this.setToBack) ); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_FORWARD, this.setZLevel.bind(this, this.setForward) ); - this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_BACKWARD, this.setZLevel.bind(this, this.setBackward) ); + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_BACKWARD, this.setZLevel.bind(this, this.setBackward) ); + - }, - + onSelectionChanged: function(elemnt){ var selection = this.facade.getSelection(); if (selection.length === 1 && selection[0] instanceof ORYX.Core.Edge) { this.setToTop(selection); } }, - + setZLevel:function(callback, event){ - + //Command-Pattern for dragging one docker var zLevelCommand = ORYX.Core.Command.extend({ construct: function(callback, elements, facade){ @@ -19141,30 +19141,30 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ // For redo, the previous elements get stored this.elAndIndex = elements.map(function(el){ return {el:el, previous:el.parent.children[el.parent.children.indexOf(el)-1]} }) this.facade = facade; - }, + }, execute: function(){ - + // Call the defined z-order callback with the elements - this.callback( this.elements ) + this.callback( this.elements ) this.facade.setSelection( this.elements ) }, rollback: function(){ - + // Sort all elements on the index of there containment var sortedEl = this.elAndIndex.sortBy( function( el ) { var value = el.el; var t = $A(value.node.parentNode.childNodes); return t.indexOf(value.node); - }); - + }); + // Every element get setted back bevor the old previous element for(var i=0; i maxSize.width) { - newBounds.a.x = shape.bounds.upperLeft().x - + newBounds.a.x = shape.bounds.upperLeft().x - (maxSize.width - shape.bounds.width())/2; - + newBounds.b.x = shape.bounds.lowerRight().x + (maxSize.width - shape.bounds.width())/2 } - + /* If the new height of shape exceeds the maximum height, set height value to maximum. */ if(this.maxHeight > maxSize.height) { - newBounds.a.y = shape.bounds.upperLeft().y - + newBounds.a.y = shape.bounds.upperLeft().y - (maxSize.height - shape.bounds.height())/2; - + newBounds.b.y = shape.bounds.lowerRight().y + (maxSize.height - shape.bounds.height())/2 } - + /* set bounds of shape */ shape.bounds.set(newBounds); - - }, + + }, execute: function(){ // align each shape according to the way that was specified. this.elements.each(function(shape, index) { this.orgPos[index] = shape.bounds.upperLeft(); - + var relBounds = this.bounds.clone(); var newCoordinates; if (shape.parent && !(shape.parent instanceof ORYX.Core.Canvas) ) { var upL = shape.parent.absoluteBounds().upperLeft(); relBounds.moveBy(-upL.x, -upL.y); } - + switch (this.way) { // align the shapes in the requested way. case ORYX.CONFIG.EDITOR_ALIGN_BOTTOM: @@ -19365,37 +19365,37 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ x: shape.bounds.upperLeft().x, y: relBounds.b.y - shape.bounds.height() }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_MIDDLE: newCoordinates = { x: shape.bounds.upperLeft().x, y: (relBounds.a.y + relBounds.b.y - shape.bounds.height()) / 2 }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_TOP: newCoordinates = { x: shape.bounds.upperLeft().x, y: relBounds.a.y }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_LEFT: newCoordinates = { x: relBounds.a.x, y: shape.bounds.upperLeft().y }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_CENTER: newCoordinates = { x: (relBounds.a.x + relBounds.b.x - shape.bounds.width()) / 2, y: shape.bounds.upperLeft().y }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_RIGHT: newCoordinates = { x: relBounds.b.x - shape.bounds.width(), y: shape.bounds.upperLeft().y }; break; - + case ORYX.CONFIG.EDITOR_ALIGN_SIZE: if(shape.isResizable) { this.orgPos[index] = {a: shape.bounds.upperLeft(), b: shape.bounds.lowerRight()}; @@ -19403,7 +19403,7 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ } break; } - + if (newCoordinates){ var offset = { x: shape.bounds.upperLeft().x - newCoordinates.x, @@ -19413,9 +19413,9 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ shape.bounds.moveTo(newCoordinates); this.plugin.layoutEdges(shape, shape.getAllDockedShapes(),offset); //shape.update() - } + } }.bind(this)); - + //this.facade.getCanvas().update(); //this.facade.updateSelection(); }, @@ -19425,15 +19425,15 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ if(shape.isResizable) {shape.bounds.set(this.orgPos[index]);} } else {shape.bounds.moveTo(this.orgPos[index]);} }.bind(this)); - + //this.facade.getCanvas().update(); //this.facade.updateSelection(); } }) - + var command = new commandClass(elements, bounds, maxHeight, maxWidth, parseInt(way), this); - - this.facade.executeCommands([command]); + + this.facade.executeCommands([command]); } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -19445,65 +19445,65 @@ ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if (!ORYX.Plugins) +if (!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.Save = Clazz.extend({ - + facade: undefined, - + processURI: undefined, - + changeSymbol : "*", - + construct: function(facade){ this.facade = facade; - + document.addEventListener("keydown", function(e){ if (e.ctrlKey&&e.keyCode === 83){ Event.stop(e); } }, false); - + window.onbeforeunload = this.onUnLoad.bind(this); - + this.changeDifference = 0; - - // Register on event for executing commands --> store all commands in a stack + + // Register on event for executing commands --> store all commands in a stack // --> Execute this.facade.registerOnEvent(ORYX.CONFIG.EVENT_UNDO_EXECUTE, function(){ this.changeDifference++; this.updateTitle(); }.bind(this) ); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_EXECUTE_COMMANDS, function(){ this.changeDifference++; this.updateTitle(); }.bind(this) ); // --> Saved from other places in the editor this.facade.registerOnEvent(ORYX.CONFIG.EVENT_SAVED, function(){ this.changeDifference = 0; this.updateTitle(); }.bind(this) ); - + // --> Rollback this.facade.registerOnEvent(ORYX.CONFIG.EVENT_UNDO_ROLLBACK, function(){ this.changeDifference--; this.updateTitle(); }.bind(this) ); - + //TODO very critical for load time performance!!! //this.serializedDOM = DataManager.__persistDOM(this.facade); - + this.hasChanges = this._hasChanges.bind(this); }, - + updateTitle: function(){ - + var value = window.document.title || document.getElementsByTagName("title")[0].childNodes[0].nodeValue; - + if (this.changeDifference === 0 && value.startsWith(this.changeSymbol)){ window.document.title = value.slice(1); } else if (this.changeDifference !== 0 && !value.startsWith(this.changeSymbol)){ window.document.title = this.changeSymbol + "" + value; } }, - + _hasChanges: function() { return this.changeDifference !== 0 || (this.facade.getModelMetaData()['new'] && this.facade.getCanvas().getChildShapes().size() > 0); }, - + onUnLoad: function(){ if(this._hasChanges()) { return ORYX.I18N.Save.unsavedData; - } + } } }); /* @@ -19516,7 +19516,7 @@ ORYX.Plugins.Save = Clazz.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if(!ORYX.Plugins) +if(!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ @@ -19542,39 +19542,39 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.containmentParentNode; // the current future parent node for the dragged shapes this.isAddingAllowed = false; // flag, if adding current selected shapes to containmentParentNode is allowed this.isAttachingAllowed = false; // flag, if attaching to the current shape is allowed - + this.callbackMouseMove = this.handleMouseMove.bind(this); this.callbackMouseUp = this.handleMouseUp.bind(this); - - // Get the SVG-Containernode + + // Get the SVG-Containernode var containerNode = this.facade.getCanvas().getSvgContainer(); - + // Create the Selected Rectangle in the SVG this.selectedRect = new ORYX.Plugins.SelectedRect(containerNode); - + // Show grid line if enabled if (ORYX.CONFIG.SHOW_GRIDLINE) { this.vLine = new ORYX.Plugins.GridLine(containerNode, ORYX.Plugins.GridLine.DIR_VERTICAL); this.hLine = new ORYX.Plugins.GridLine(containerNode, ORYX.Plugins.GridLine.DIR_HORIZONTAL); } - + // Get a HTML-ContainerNode containerNode = this.facade.getCanvas().getHTMLContainer(); - + this.scrollNode = this.facade.getCanvas().rootNode.parentNode.parentNode; - + // Create the southeastern button for resizing this.resizerSE = new ORYX.Plugins.Resizer(containerNode, "southeast", this.facade); this.resizerSE.registerOnResize(this.onResize.bind(this)); // register the resize callback this.resizerSE.registerOnResizeEnd(this.onResizeEnd.bind(this)); // register the resize end callback this.resizerSE.registerOnResizeStart(this.onResizeStart.bind(this)); // register the resize start callback - + // Create the northwestern button for resizing this.resizerNW = new ORYX.Plugins.Resizer(containerNode, "northwest", this.facade); this.resizerNW.registerOnResize(this.onResize.bind(this)); // register the resize callback this.resizerNW.registerOnResizeEnd(this.onResizeEnd.bind(this)); // register the resize end callback this.resizerNW.registerOnResizeStart(this.onResizeStart.bind(this)); // register the resize start callback - + // For the Drag and Drop // Register on MouseDown-Event on a Shape this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this)); @@ -19588,7 +19588,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // If the selection Bounds not intialized and the uiObj is not member of current selectio // then return if(!this.dragBounds || !this.currentShapes.member(uiObj) || !this.toMoveShapes.length) {return;}; - + // Start Dragging this.dragEnable = true; this.dragIntialized = true; @@ -19598,7 +19598,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ var a = this.facade.getCanvas().node.getScreenCTM(); this.faktorXY.x = a.a; this.faktorXY.y = a.d; - + var eventX = Event.pointerX(event); var eventY = Event.pointerY(event); @@ -19607,13 +19607,13 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.offSetPosition = { x: eventX - (upL.x * this.faktorXY.x), y: eventY - (upL.y * this.faktorXY.y)}; - + this.offsetScroll = {x:this.scrollNode.scrollLeft,y:this.scrollNode.scrollTop}; - + // Register on Global Mouse-MOVE Event - document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false); + document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false); // Register on Global Mouse-UP Event - document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true); + document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true); return; }, @@ -19623,13 +19623,13 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ * */ handleMouseUp: function(event) { - + //disable containment highlighting this.facade.raiseEvent({ type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:"dragdropresize.contain" }); - + this.facade.raiseEvent({ type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:"dragdropresize.attached" @@ -19637,24 +19637,24 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // If Dragging is finished if(this.dragEnable) { - + // and update the current selection if(!this.dragIntialized) { - + // Do Method after Dragging - this.afterDrag(); - - // Check if the Shape is allowed to dock to the other Shape + this.afterDrag(); + + // Check if the Shape is allowed to dock to the other Shape if ( this.isAttachingAllowed && this.toMoveShapes.length == 1 && this.toMoveShapes[0] instanceof ORYX.Core.Node && this.toMoveShapes[0].dockers.length > 0) { - - // Get the position and the docker - var position = this.facade.eventCoordinates( event ); + + // Get the position and the docker + var position = this.facade.eventCoordinates( event ); var docker = this.toMoveShapes[0].dockers[0]; - + //Command-Pattern for dragging several Shapes var dockCommand = ORYX.Core.Command.extend({ construct: function(docker, position, newDockedShape, facade){ @@ -19666,17 +19666,17 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.oldDockedShape = docker.getDockedShape(); this.oldParent = docker.parent.parent || facade.getCanvas(); this.facade = facade; - + if( this.oldDockedShape ){ this.oldPosition = docker.parent.absoluteBounds().center(); } - - }, + + }, execute: function(){ this.dock( this.newDockedShape, this.newParent, this.newPosition ); - + // Raise Event for having the docked shape on top of the other shape - this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_ARRANGEMENT_TOP, excludeCommand: true}) + this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_ARRANGEMENT_TOP, excludeCommand: true}) }, rollback: function(){ this.dock( this.oldDockedShape, this.oldParent, this.oldPosition ); @@ -19684,42 +19684,42 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ dock:function( toDockShape, parent, pos ){ // Add to the same parent Shape parent.add( this.docker.parent ) - - + + // Set the Docker to the new Shape this.docker.setDockedShape( undefined ); - this.docker.bounds.centerMoveTo( pos ) - this.docker.setDockedShape( toDockShape ); + this.docker.bounds.centerMoveTo( pos ) + this.docker.setDockedShape( toDockShape ); //this.docker.update(); - - this.facade.setSelection( [this.docker.parent] ); + + this.facade.setSelection( [this.docker.parent] ); this.facade.getCanvas().update(); this.facade.updateSelection(); - - + + } }); - + // Instanziate the dockCommand var commands = [new dockCommand(docker, position, this.containmentParentNode, this.facade)]; - this.facade.executeCommands(commands); - - - // Check if adding is allowed to the other Shape + this.facade.executeCommands(commands); + + + // Check if adding is allowed to the other Shape } else if( this.isAddingAllowed ) { - - + + // Refresh all Shapes --> Set the new Bounds this.refreshSelectedShapes(); - + } - + this.facade.updateSelection(); - + //this.currentShapes.each(function(shape) {shape.update()}) // Raise Event: Dragging is finished this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_DRAGDROP_END}); - } + } if (this.vLine) this.vLine.hide(); @@ -19727,14 +19727,14 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.hLine.hide(); } - // Disable - this.dragEnable = false; - + // Disable + this.dragEnable = false; + // UnRegister on Global Mouse-UP/-Move Event - document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true); - document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false); - + document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true); + document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false); + return; }, @@ -19750,32 +19750,32 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // Raise Event: Drag will be started this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_DRAGDROP_START}); this.dragIntialized = false; - + // And hide the resizers and the highlighting this.resizerSE.hide(); this.resizerNW.hide(); - + // if only edges are selected, containmentParentNode must be the canvas this._onlyEdges = this.currentShapes.all(function(currentShape) { return (currentShape instanceof ORYX.Core.Edge); }); - + // Do method before Drag this.beforeDrag(); - + this._currentUnderlyingNodes = []; - + } - + // Calculate the new position var position = { x: Event.pointerX(event) - this.offSetPosition.x, y: Event.pointerY(event) - this.offSetPosition.y} - position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; + position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; position.y -= this.offsetScroll.y - this.scrollNode.scrollTop; - + // If not the Control-Key are pressed var modifierKeyPressed = event.shiftKey || event.ctrlKey; if(ORYX.CONFIG.GRID_ENABLED && !modifierKeyPressed) { @@ -19788,7 +19788,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.hLine.hide(); } - // Adjust the point by the zoom faktor + // Adjust the point by the zoom faktor position.x /= this.faktorXY.x; position.y /= this.faktorXY.y; @@ -19799,8 +19799,8 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // Set that the position is not bigger than the canvas var c = this.facade.getCanvas(); position.x = Math.min( c.bounds.width() - this.dragBounds.width(), position.x) - position.y = Math.min( c.bounds.height() - this.dragBounds.height(), position.y) - + position.y = Math.min( c.bounds.height() - this.dragBounds.height(), position.y) + // Drag this bounds this.dragBounds.moveTo(position); @@ -19813,7 +19813,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ //check, if a node can be added to the underlying node var eventCoordinates = this.facade.eventCoordinates(event); - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -19825,31 +19825,31 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ } } } - + if (additionalIEZoom !== 1) { eventCoordinates.x = eventCoordinates.x / additionalIEZoom; eventCoordinates.y = eventCoordinates.y / additionalIEZoom; } - + var underlyingNodes = $A(this.facade.getCanvas().getAbstractShapesAtPosition(eventCoordinates)); - + var checkIfAttachable = this.toMoveShapes.length == 1 && this.toMoveShapes[0] instanceof ORYX.Core.Node && this.toMoveShapes[0].dockers.length > 0 checkIfAttachable = checkIfAttachable && underlyingNodes.length != 1 - - + + if (!checkIfAttachable && underlyingNodes.length === this._currentUnderlyingNodes.length && underlyingNodes.all(function(node, index){return this._currentUnderlyingNodes[index] === node}.bind(this))) { - + return - + } else if(this._onlyEdges) { - + this.isAddingAllowed = true; this.containmentParentNode = this.facade.getCanvas(); - + } else { - + /* Check the containment and connection rules */ var options = { event : event, @@ -19857,14 +19857,14 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ checkIfAttachable : checkIfAttachable }; this.checkRules(options); - + } - + this._currentUnderlyingNodes = underlyingNodes.reverse(); - + //visualize the containment result if( this.isAttachingAllowed ) { - + this.facade.raiseEvent({ type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, highlightId: "dragdropresize.attached", @@ -19872,15 +19872,15 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ style: ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE, color: ORYX.CONFIG.SELECTION_VALID_COLOR }); - + } else { - + this.facade.raiseEvent({ type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:"dragdropresize.attached" }); } - + if( !this.isAttachingAllowed ){ if( this.isAddingAllowed ) { @@ -19905,14 +19905,14 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.facade.raiseEvent({ type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:"dragdropresize.contain" - }); - } + }); + } // Stop the Event //Event.stop(event); return; }, - + // /** // * Rollbacks the docked shape of an edge, if the edge is not movable. // */ @@ -19922,7 +19922,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // el.docker.setReferencePoint(el.refPoint); // }) // }, - + /** * Checks the containment and connection rules for the selected shapes. */ @@ -19931,33 +19931,33 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ var underlyingNodes = options.underlyingNodes; var checkIfAttachable = options.checkIfAttachable; var noEdges = options.noEdges; - + //get underlying node that is not the same than one of the currently selected shapes or // a child of one of the selected shapes with the highest z Order. // The result is a shape or the canvas this.containmentParentNode = underlyingNodes.reverse().find((function(node) { - return (node instanceof ORYX.Core.Canvas) || - (((node instanceof ORYX.Core.Node) || ((node instanceof ORYX.Core.Edge) && !noEdges)) - && (!(this.currentShapes.member(node) || + return (node instanceof ORYX.Core.Canvas) || + (((node instanceof ORYX.Core.Node) || ((node instanceof ORYX.Core.Edge) && !noEdges)) + && (!(this.currentShapes.member(node) || this.currentShapes.any(function(shape) { return (shape.children.length > 0 && shape.getChildNodes(true).member(node)); })))); }).bind(this)); - + if( checkIfAttachable ){ - + this.isAttachingAllowed = this.facade.getRules().canConnect({ - sourceShape: this.containmentParentNode, - edgeShape: this.toMoveShapes[0], + sourceShape: this.containmentParentNode, + edgeShape: this.toMoveShapes[0], targetShape: this.toMoveShapes[0] - }); - + }); + if ( this.isAttachingAllowed ) { var point = this.facade.eventCoordinates(event); this.isAttachingAllowed = this.containmentParentNode.isPointOverOffset( point.x, point.y ); - } + } } - + if( !this.isAttachingAllowed ){ //check all selected shapes, if they can be added to containmentParentNode this.isAddingAllowed = this.toMoveShapes.all((function(currentShape) { @@ -19966,27 +19966,27 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.containmentParentNode === currentShape.parent) { return true; } else if(this.containmentParentNode !== currentShape) { - + if(!(this.containmentParentNode instanceof ORYX.Core.Edge) || !noEdges) { - + if(this.facade.getRules().canContain({containingShape:this.containmentParentNode, - containedShape:currentShape})) { + containedShape:currentShape})) { return true; } } } return false; - }).bind(this)); + }).bind(this)); } - - if(!this.isAttachingAllowed && !this.isAddingAllowed && + + if(!this.isAttachingAllowed && !this.isAddingAllowed && (this.containmentParentNode instanceof ORYX.Core.Edge)) { options.noEdges = true; options.underlyingNodes.reverse(); - this.checkRules(options); + this.checkRules(options); } }, - + /** * Redraw the selected Shapes. * @@ -20008,15 +20008,15 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ if( this._undockedEdgesCommand instanceof ORYX.Core.Command ){ commands.unshift( this._undockedEdgesCommand ); } - // Execute the commands - this.facade.executeCommands( commands ); + // Execute the commands + this.facade.executeCommands( commands ); // copy the bounds to the old bounds if( this.dragBounds ) this.oldDragBounds = this.dragBounds.clone(); }, - + /** * Callback for Resize * @@ -20024,44 +20024,44 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ onResize: function(bounds) { // If the selection bounds not initialized, return if(!this.dragBounds) {return} - + this.dragBounds = bounds; this.isResizing = true; - // Update the rectangle + // Update the rectangle this.resizeRectangle(this.dragBounds); }, - + onResizeStart: function() { this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_RESIZE_START}); }, onResizeEnd: function() { - + if (!(this.currentShapes instanceof Array)||this.currentShapes.length<=0) { return; } - + // If Resizing finished, the Shapes will be resize if(this.isResizing) { - + var commandClass = ORYX.Core.Command.extend({ construct: function(shape, newBounds, plugin){ this.shape = shape; this.oldBounds = shape.bounds.clone(); this.newBounds = newBounds; this.plugin = plugin; - }, + }, execute: function(){ this.shape.bounds.set(this.newBounds.a, this.newBounds.b); this.update(this.getOffset(this.oldBounds, this.newBounds)); - + }, rollback: function(){ this.shape.bounds.set(this.oldBounds.a, this.oldBounds.b); this.update(this.getOffset(this.newBounds, this.oldBounds)) }, - + getOffset:function(b1, b2){ return { x: b2.a.x - b1.a.x, @@ -20074,12 +20074,12 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.shape.getLabels().each(function(label) { label.changed(); }); - + var allEdges = [].concat(this.shape.getIncomingShapes()) .concat(this.shape.getOutgoingShapes()) // Remove all edges which are included in the selection from the list .findAll(function(r){ return r instanceof ORYX.Core.Edge }.bind(this)) - + this.plugin.layoutEdges(this.shape, allEdges, offset); this.plugin.facade.setSelection([this.shape]); @@ -20087,25 +20087,25 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ this.plugin.facade.updateSelection(); } }); - + var bounds = this.dragBounds.clone(); var shape = this.currentShapes[0]; - + if(shape.parent) { var parentPosition = shape.parent.absoluteXY(); bounds.moveBy(-parentPosition.x, -parentPosition.y); } - + var command = new commandClass(shape, bounds, this); - + this.facade.executeCommands([command]); - + this.isResizing = false; - + this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_RESIZE_END}); } }, - + /** * Prepare the Dragging @@ -20116,7 +20116,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ var undockEdgeCommand = ORYX.Core.Command.extend({ construct: function(moveShapes){ this.dockers = moveShapes.collect(function(shape){ return shape instanceof ORYX.Core.Controls.Docker ? {docker:shape, dockedShape:shape.getDockedShape(), refPoint:shape.referencePoint} : undefined }).compact(); - }, + }, execute: function(){ this.dockers.each(function(el){ el.docker.setDockedShape(undefined); @@ -20130,14 +20130,14 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ }) } }); - + this._undockedEdgesCommand = new undockEdgeCommand( this.toMoveShapes ); - this._undockedEdgesCommand.execute(); - + this._undockedEdgesCommand.execute(); + }, hideAllLabels: function(shape) { - + // Hide all labels from the shape shape.getLabels().each(function(label) { label.hide(); @@ -20165,12 +20165,12 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ * */ afterDrag: function(){ - + }, /** * Show all Labels at these shape - * + * */ showAllLabels: function(shape) { @@ -20184,7 +20184,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ //shape.getAllDockedShapes().each(function(dockedShape) { var allDockedShapes = shape.getAllDockedShapes() for(var i=0; i 0) { labels.each(function(label) { @@ -20196,7 +20196,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // Do this recursive //shape.children.each((function(value) { for(var i=0; i 2 && hasF && hasL){ this.toMoveShapes = this.toMoveShapes.concat(dks.findAll(function(el,index){ return index > 0 && index < dks.length-1})); } - + }).bind(this)); - + // Calculate the new area-bounds of the selection var newBounds = undefined; this.toMoveShapes.each(function(value) { @@ -20282,7 +20282,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ /* Get the Shape */ shape = value.parent; } - + if(!newBounds){ newBounds = shape.absoluteBounds(); } @@ -20290,7 +20290,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ newBounds.include(shape.absoluteBounds()); } }.bind(this)); - + if(!newBounds){ elements.each(function(value){ if(!newBounds) { @@ -20300,7 +20300,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ } }); } - + // Set the new bounds this.dragBounds = newBounds; this.oldDragBounds = newBounds.clone(); @@ -20308,7 +20308,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // Update and show the rectangle this.resizeRectangle(newBounds); this.selectedRect.show(); - + // Show the resize button, if there is only one element and this is resizeable if(elements.length == 1 && elements[0].isResizable) { var aspectRatio = elements[0].getStencil().fixedAspectRatio() ? elements[0].bounds.width() / elements[0].bounds.height() : undefined; @@ -20329,7 +20329,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ if (this.distPointTimeout) window.clearTimeout(this.distPointTimeout) - + this.distPointTimeout = window.setTimeout(function(){ // Get all the shapes, there will consider at snapping // Consider only those elements who shares the same parent element @@ -20341,7 +20341,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ } return true; }) - + // The current selection will delete from this array //elements.each(function(shape) { // distShapes = distShapes.without(shape); @@ -20371,7 +20371,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ }); } }).bind(this)); - + }.bind(this), 10) @@ -20387,7 +20387,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ // Get the current Bounds var bounds = this.dragBounds; - + var point = {}; var ulThres = 6; @@ -20395,14 +20395,14 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ var lrThres = 6; var scale = this.vLine ? this.vLine.getScale() : 1; - + var ul = { x: (position.x/scale), y: (position.y/scale)}; var c = { x: (position.x/scale) + (bounds.width()/2), y: (position.y/scale) + (bounds.height()/2)}; var lr = { x: (position.x/scale) + (bounds.width()), y: (position.y/scale) + (bounds.height())}; var offsetX, offsetY; var gridX, gridY; - + // For each distant point this.distPoints.each(function(value) { @@ -20417,7 +20417,7 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ x = value.lr.x-lr.x; gx = value.lr.x; } */ - + if (Math.abs(value.c.y-c.y) < cThres){ y = value.c.y-c.y; @@ -20442,10 +20442,10 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ gridY = gy; } }); - - + + if (offsetX !== undefined) { - ul.x += offsetX; + ul.x += offsetX; ul.x *= scale; if (this.vLine&&gridX) this.vLine.update(gridX); @@ -20454,8 +20454,8 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ if (this.vLine) this.vLine.hide() } - - if (offsetY !== undefined) { + + if (offsetY !== undefined) { ul.y += offsetY; ul.y *= scale; if (this.hLine&&gridY) @@ -20465,12 +20465,12 @@ ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({ if (this.hLine) this.hLine.hide(); } - + return ul; }, - + showGridLine: function(){ - + }, @@ -20529,14 +20529,14 @@ ORYX.Plugins.SelectedRect = Clazz.extend({ ORYX.Plugins.GridLine = Clazz.extend({ - + construct: function(parentId, direction) { if (ORYX.Plugins.GridLine.DIR_HORIZONTAL !== direction && ORYX.Plugins.GridLine.DIR_VERTICAL !== direction) { direction = ORYX.Plugins.GridLine.DIR_HORIZONTAL } - - + + this.parent = $(parentId); this.direction = direction; this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.parent, @@ -20567,19 +20567,19 @@ ORYX.Plugins.GridLine = Clazz.extend({ return 1; } }, - + update: function(pos) { - + if (this.direction === ORYX.Plugins.GridLine.DIR_HORIZONTAL) { - var y = pos instanceof Object ? pos.y : pos; + var y = pos instanceof Object ? pos.y : pos; var cWidth = this.parent.parentNode.parentNode.width.baseVal.value/this.getScale(); this.line.setAttributeNS(null, 'd', 'M 0 '+y+ ' L '+cWidth+' '+y); } else { - var x = pos instanceof Object ? pos.x : pos; + var x = pos instanceof Object ? pos.x : pos; var cHeight = this.parent.parentNode.parentNode.height.baseVal.value/this.getScale(); this.line.setAttributeNS(null, 'd', 'M'+x+ ' 0 L '+x+' '+cHeight); } - + this.show(); } @@ -20596,7 +20596,7 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.parentId = parentId; this.orientation = orientation; this.facade = facade; - + this.node = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", $('canvasSection'), ['div', {'class': 'resizer_'+ this.orientation, style:'left:0px; top:0px;position:absolute;'}]); @@ -20612,14 +20612,14 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.minSize = undefined; this.maxSize = undefined; - + this.aspectRatio = undefined; this.resizeCallbacks = []; this.resizeStartCallbacks = []; this.resizeEndCallbacks = []; this.hide(); - + // Calculate the Offset this.scrollNode = this.node.parentNode.parentNode.parentNode; @@ -20629,11 +20629,11 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.dragEnable = true; this.offsetScroll = {x:this.scrollNode.scrollLeft,y:this.scrollNode.scrollTop}; - + this.offSetPosition = { x: Event.pointerX(event) - this.position.x, y: Event.pointerY(event) - this.position.y}; - + this.resizeStartCallbacks.each((function(value) { value(this.bounds); }).bind(this)); @@ -20646,12 +20646,12 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.resizeEndCallbacks.each((function(value) { value(this.bounds); }).bind(this)); - + }, handleMouseMove: function(event) { if(!this.dragEnable) { return } - + if(event.shiftKey || event.ctrlKey) { this.aspectRatio = this.bounds.width() / this.bounds.height(); } else { @@ -20663,17 +20663,17 @@ ORYX.Plugins.Resizer = Clazz.extend({ y: Event.pointerY(event) - this.offSetPosition.y}; - position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; + position.x -= this.offsetScroll.x - this.scrollNode.scrollLeft; position.y -= this.offsetScroll.y - this.scrollNode.scrollTop; - + position.x = Math.min( position.x, this.facade.getCanvas().bounds.width()); position.y = Math.min( position.y, this.facade.getCanvas().bounds.height()); - + var offset = { x: position.x - this.position.x, y: position.y - this.position.y }; - + if(this.aspectRatio) { // fixed aspect ratio newAspectRatio = (this.bounds.width()+offset.x) / (this.bounds.height()+offset.y); @@ -20683,10 +20683,10 @@ ORYX.Plugins.Resizer = Clazz.extend({ offset.y = (this.bounds.width()+offset.x) / this.aspectRatio - this.bounds.height(); } } - + // respect minimum and maximum sizes of stencil if(this.orientation==="northwest") { - + if(this.bounds.width()-offset.x > this.maxSize.width) { offset.x = -(this.maxSize.width - this.bounds.width()); if(this.aspectRatio) @@ -20707,7 +20707,7 @@ ORYX.Plugins.Resizer = Clazz.extend({ if(this.aspectRatio) offset.x = offset.y / this.aspectRatio; } - + } else { // defaults to southeast if(this.bounds.width()+offset.x > this.maxSize.width) { offset.x = this.maxSize.width - this.bounds.width(); @@ -20747,13 +20747,13 @@ ORYX.Plugins.Resizer = Clazz.extend({ Event.stop(event); }, - + registerOnResizeStart: function(callback) { if(!this.resizeStartCallbacks.member(callback)) { this.resizeStartCallbacks.push(callback); } }, - + unregisterOnResizeStart: function(callback) { if(this.resizeStartCallbacks.member(callback)) { this.resizeStartCallbacks = this.resizeStartCallbacks.without(callback); @@ -20765,13 +20765,13 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.resizeEndCallbacks.push(callback); } }, - + unregisterOnResizeEnd: function(callback) { if(this.resizeEndCallbacks.member(callback)) { this.resizeEndCallbacks = this.resizeEndCallbacks.without(callback); } }, - + registerOnResize: function(callback) { if(!this.resizeCallbacks.member(callback)) { this.resizeCallbacks.push(callback); @@ -20804,7 +20804,7 @@ ORYX.Plugins.Resizer = Clazz.extend({ this.minSize = min; this.maxSize = max; - + this.aspectRatio = aspectRatio; this.update(); @@ -20814,17 +20814,17 @@ ORYX.Plugins.Resizer = Clazz.extend({ if(!this.bounds) { return; } var upL = this.bounds.upperLeft(); - + if(this.bounds.width() < this.minSize.width) { this.bounds.set(upL.x, upL.y, upL.x + this.minSize.width, upL.y + this.bounds.height());}; if(this.bounds.height() < this.minSize.height) { this.bounds.set(upL.x, upL.y, upL.x + this.bounds.width(), upL.y + this.minSize.height);}; if(this.bounds.width() > this.maxSize.width) { this.bounds.set(upL.x, upL.y, upL.x + this.maxSize.width, upL.y + this.bounds.height());}; if(this.bounds.height() > this.maxSize.height) { this.bounds.set(upL.x, upL.y, upL.x + this.bounds.width(), upL.y + this.maxSize.height);}; var a = this.canvasNode.getScreenCTM(); - + upL.x *= a.a; upL.y *= a.d; - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -20836,16 +20836,16 @@ ORYX.Plugins.Resizer = Clazz.extend({ } } } - + if (additionalIEZoom === 1) { upL.y = upL.y - jQuery("#canvasSection").offset().top + a.f; upL.x = upL.x - jQuery("#canvasSection").offset().left + a.e; - + } else { var canvasOffsetLeft = jQuery("#canvasSection").offset().left; var canvasScrollLeft = jQuery("#canvasSection").scrollLeft(); var canvasScrollTop = jQuery("#canvasSection").scrollTop(); - + var offset = a.e - (canvasOffsetLeft * additionalIEZoom); var additionaloffset = 0; if (offset > 10) { @@ -20854,7 +20854,7 @@ ORYX.Plugins.Resizer = Clazz.extend({ upL.y = upL.y - (jQuery("#canvasSection").offset().top * additionalIEZoom) + ((canvasScrollTop * additionalIEZoom) - canvasScrollTop) + a.f; upL.x = upL.x - (canvasOffsetLeft * additionalIEZoom) + additionaloffset + ((canvasScrollLeft * additionalIEZoom) - canvasScrollLeft) + a.e; } - + if(this.orientation==="northwest") { upL.x -= 13; upL.y -= 13; @@ -20862,7 +20862,7 @@ ORYX.Plugins.Resizer = Clazz.extend({ upL.x += (a.a * this.bounds.width()) + 3 ; upL.y += (a.d * this.bounds.height()) + 3; } - + this.position = upL; this.node.style.left = this.position.x + "px"; @@ -20874,8 +20874,8 @@ ORYX.Plugins.Resizer = Clazz.extend({ /** * Implements a Command to move shapes - * - */ + * + */ ORYX.Core.Command.Move = ORYX.Core.Command.extend({ construct: function(moveShapes, offset, parent, selectedShapes, plugin){ this.moveShapes = moveShapes; @@ -20886,13 +20886,13 @@ ORYX.Core.Command.Move = ORYX.Core.Command.extend({ this.newParents = moveShapes.collect(function(t){ return parent || t.parent }); this.oldParents = moveShapes.collect(function(shape){ return shape.parent }); this.dockedNodes= moveShapes.findAll(function(shape){ return shape instanceof ORYX.Core.Node && shape.dockers.length == 1}).collect(function(shape){ return {docker:shape.dockers[0], dockedShape:shape.dockers[0].getDockedShape(), refPoint:shape.dockers[0].referencePoint} }); - }, + }, execute: function(){ - this.dockAllShapes() + this.dockAllShapes() // Moves by the offset this.move( this.offset); // Addes to the new parents - this.addShapeToParent( this.newParents ); + this.addShapeToParent( this.newParents ); // Set the selection to the current selection this.selectCurrentShapes(); this.plugin.facade.getCanvas().update(); @@ -20903,35 +20903,35 @@ ORYX.Core.Command.Move = ORYX.Core.Command.extend({ var offset = { x:-this.offset.x, y:-this.offset.y }; this.move( offset ); // Addes to the old parents - this.addShapeToParent( this.oldParents ); - this.dockAllShapes(true) - + this.addShapeToParent( this.oldParents ); + this.dockAllShapes(true) + // Set the selection to the current selection this.selectCurrentShapes(); this.plugin.facade.getCanvas().update(); this.plugin.facade.updateSelection(); - + }, move:function(offset, doLayout){ - + // Move all Shapes by these offset for(var i=0; i Math.abs(center.x - dockerCenter.x) ? center.x - dockerCenter.x : nearestX; nearestY = Math.abs(nearestY) > Math.abs(center.y - dockerCenter.y) ? center.y - dockerCenter.y : nearestY; - - + + }).bind(this)); - + if (Math.abs(nearestX) < minOffset || Math.abs(nearestY) < minOffset) { nearestX = Math.abs(nearestX) < minOffset ? nearestX : 0; nearestY = Math.abs(nearestY) < minOffset ? nearestY : 0; - + this.docker.bounds.centerMoveTo(dockerCenter.x + nearestX, dockerCenter.y + nearestY); //this.docker.update() } else { - - - + + + var previous = this.docker.parent.dockers[Math.max(this.docker.parent.dockers.indexOf(this.docker)-1, 0)]; var next = this.docker.parent.dockers[Math.min(this.docker.parent.dockers.indexOf(this.docker)+1, this.docker.parent.dockers.length-1)]; - + if (previous && next && previous !== this.docker && next !== this.docker){ var cp = previous.bounds.center(); var cn = next.bounds.center(); var cd = this.docker.bounds.center(); - + // Checks if the point is on the line between previous and next if (ORYX.Core.Math.isPointInLine(cd.x, cd.y, cp.x, cp.y, cn.x, cn.y, 10)) { // Get the rise @@ -21419,13 +21419,13 @@ ORYX.Plugins.DragDocker = Clazz.extend({ // Calculate the intersection point var intersecX = ((cp.y-(cp.x*raise))-(cd.y-(cd.x*(-Math.pow(raise,-1)))))/((-Math.pow(raise,-1))-raise); var intersecY = (cp.y-(cp.x*raise))+(raise*intersecX); - + if(isNaN(intersecX) || isNaN(intersecY)) {return;} - + this.docker.bounds.centerMoveTo(intersecX, intersecY); } } - + } } } @@ -21438,45 +21438,45 @@ ORYX.Plugins.DragDocker = Clazz.extend({ * */ dockerMovedFinished: function(event) { - + /* Reset to buffered shape selection */ this.facade.setSelection(this.shapeSelection); - + // Hide the border this.hideHighlight(); - + // Show all Labels from Docker this.dockerParent.getLabels().each(function(label){ label.show(); //label.update(); }); - + // If there is a last top level Shape - if(this.lastUIObj && (this.isStartDocker || this.isEndDocker)){ + if(this.lastUIObj && (this.isStartDocker || this.isEndDocker)){ // If there is a valid connection, the set as a docked Shape to them if(this.isValid) { - - this.docker.setDockedShape(this.lastUIObj); - + + this.docker.setDockedShape(this.lastUIObj); + this.facade.raiseEvent({ - type :ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED, + type :ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED, docker : this.docker, parent : this.docker.parent, target : this.lastUIObj }); } - + this.hideMagnets(this.lastUIObj); } - + // Hide the Docker this.docker.hide(); - + if(this.outerDockerNotMoved) { // Get the EventPosition and all Shapes on these point var evPos = this.facade.eventCoordinates(event); var shapes = this.facade.getCanvas().getAbstractShapesAtPosition(evPos); - + /* Remove edges from selection */ var shapeWithoutEdges = shapes.findAll(function(node) { return node instanceof ORYX.Core.Node; @@ -21496,8 +21496,8 @@ ORYX.Plugins.DragDocker = Clazz.extend({ this.facade = facade; this.index = docker.parent.dockers.indexOf(docker); this.shape = docker.parent; - - }, + + }, execute: function(){ if (!this.docker.parent){ this.docker = this.shape.dockers[this.index]; @@ -21514,41 +21514,41 @@ ORYX.Plugins.DragDocker = Clazz.extend({ }.bind(this)); this.facade.updateSelection(); }, - dock:function( toDockShape, pos ){ + dock:function( toDockShape, pos ){ // Set the Docker to the new Shape this.docker.setDockedShape( undefined ); - if( toDockShape ){ - this.docker.setDockedShape( toDockShape ); + if( toDockShape ){ + this.docker.setDockedShape( toDockShape ); this.docker.setReferencePoint( pos ); - //this.docker.update(); - //this.docker.parent._update(); + //this.docker.update(); + //this.docker.parent._update(); } else { this.docker.bounds.centerMoveTo( pos ); } - + this.facade.getCanvas().update(); } }); - - + + if (this.docker.parent){ // Instanziate the dockCommand var command = new dragDockerCommand(this.docker, this.docker.getDockedShape() ? this.docker.referencePoint : this.docker.bounds.center(), this._commandArg.refPoint, this.docker.getDockedShape(), this._commandArg.dockedShape, this.facade); - this.facade.executeCommands( [command] ); + this.facade.executeCommands( [command] ); } } - + // Update all Shapes //this.facade.updateSelection(); - + // Undefined all variables this.docker = undefined; this.dockerParent = undefined; this.dockerSource = undefined; - this.dockerTarget = undefined; - this.lastUIObj = undefined; + this.dockerTarget = undefined; + this.lastUIObj = undefined; }, - + /** * Hide the highlighting */ @@ -21561,37 +21561,37 @@ ORYX.Plugins.DragDocker = Clazz.extend({ * */ showHighlight: function(uiObj, color) { - + this.facade.raiseEvent({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, + type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, highlightId:'validDockedShape', elements: [uiObj], color: color }); }, - + showMagnets: function(uiObj){ uiObj.magnets.each(function(magnet) { magnet.show(); }); }, - + hideMagnets: function(uiObj){ uiObj.magnets.each(function(magnet) { magnet.hide(); }); }, - + getHighestParentBeforeCanvas: function(shape) { if(!(shape instanceof ORYX.Core.Shape)) {return undefined;} - + var parent = shape.parent; while(parent && !(parent.parent instanceof ORYX.Core.Canvas)) { parent = parent.parent; - } - - return parent; - } + } + + return parent; + } }); @@ -21618,13 +21618,13 @@ ORYX.Plugins.AddDocker = Clazz.extend({ this.facade = facade; this.enableAdd = false; this.enableRemove = false; - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this)); }, - + setEnableAdd: function(enable){ this.enableAdd = enable; - + if(this.enableAdd) { jQuery("#add-bendpoint-button").addClass('pressed'); } else { @@ -21634,7 +21634,7 @@ ORYX.Plugins.AddDocker = Clazz.extend({ }, setEnableRemove: function(enable){ this.enableRemove = enable; - + if(this.enableRemove) { jQuery("#remove-bendpoint-button").addClass('pressed'); } else { @@ -21642,18 +21642,18 @@ ORYX.Plugins.AddDocker = Clazz.extend({ jQuery("#remove-bendpoint-button").blur(); } }, - + enabledAdd: function(enable){ return this.enableAdd; }, enabledRemove: function(){ return this.enableRemove; }, - + /** * MouseDown Handler * - */ + */ handleMouseDown: function(event, uiObj) { if (this.enabledAdd() && uiObj instanceof ORYX.Core.Edge) { this.newDockerCommand({ @@ -21661,7 +21661,7 @@ ORYX.Plugins.AddDocker = Clazz.extend({ position: this.facade.eventCoordinates(event) }); this.setEnableAdd(false); - + } else if (this.enabledRemove() && uiObj instanceof ORYX.Core.Controls.Docker && uiObj.parent instanceof ORYX.Core.Edge) { @@ -21673,7 +21673,7 @@ ORYX.Plugins.AddDocker = Clazz.extend({ } document.body.style.cursor = 'default'; }, - + // Options: edge (required), position (required if add), docker (required if delete) newDockerCommand: function(options){ if(!options.edge) @@ -21720,9 +21720,9 @@ ORYX.Plugins.AddDocker = Clazz.extend({ this.facade.updateSelection(); } }) - + var command = new commandClass(this.enabledAdd(), this.enabledRemove(), options.edge, options.docker, options.position, this.facade); - + this.facade.executeCommands([command]); } }); @@ -21769,7 +21769,7 @@ if(!ORYX.Plugins) if( uiObj instanceof ORYX.Core.Canvas ) { // Calculate the Offset var scrollNode = uiObj.rootNode.parentNode.parentNode; - + var a = this.facade.getCanvas().node.getScreenCTM(); this.offsetPosition = { x: a.e, @@ -21778,19 +21778,19 @@ if(!ORYX.Plugins) // Set the new Position this.setPos({ - x: Event.pointerX(event) - jQuery("#canvasSection").offset().left, + x: Event.pointerX(event) - jQuery("#canvasSection").offset().left, y: Event.pointerY(event) - jQuery("#canvasSection").offset().top + 5 }); - + // Reset the size this.resize({width:0, height:0}); this.moveCallback = this.handleMouseMove.bind(this); - + // Register Mouse-Move Event document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.moveCallback, false); this.offsetScroll = {x:scrollNode.scrollLeft,y:scrollNode.scrollTop}; - + // Show the Frame this.show(); } @@ -21805,8 +21805,8 @@ if(!ORYX.Plugins) this.hide(); // Unregister Mouse-Move - document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.moveCallback, false); - + document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.moveCallback, false); + this.moveCallback = undefined; var corrSVG = this.facade.getCanvas().node.getScreenCTM(); @@ -21821,7 +21821,7 @@ if(!ORYX.Plugins) x: a.x + Math.abs(this.size.width), y: a.y + Math.abs(this.size.height) }; - + var additionalIEZoom = 1; if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { var ua = navigator.userAgent; @@ -21833,43 +21833,43 @@ if(!ORYX.Plugins) } } } - + if (additionalIEZoom === 1) { a.x = a.x - (corrSVG.e - jQuery("#canvasSection").offset().left); a.y = a.y - (corrSVG.f - jQuery("#canvasSection").offset().top); b.x = b.x - (corrSVG.e - jQuery("#canvasSection").offset().left); b.y = b.y - (corrSVG.f - jQuery("#canvasSection").offset().top); - + } else { var canvasOffsetLeft = jQuery("#canvasSection").offset().left; var canvasScrollLeft = jQuery("#canvasSection").scrollLeft(); var canvasScrollTop = jQuery("#canvasSection").scrollTop(); - + var offset = a.e - (canvasOffsetLeft * additionalIEZoom); var additionaloffset = 0; if (offset > 10) { additionaloffset = (offset / additionalIEZoom) - offset; } - + a.x = a.x - (corrSVG.e - (canvasOffsetLeft * additionalIEZoom) + additionaloffset + ((canvasScrollLeft * additionalIEZoom) - canvasScrollLeft)); a.y = a.y - (corrSVG.f - (jQuery("#canvasSection").offset().top * additionalIEZoom) + ((canvasScrollTop * additionalIEZoom) - canvasScrollTop)); b.x = b.x - (corrSVG.e - (canvasOffsetLeft * additionalIEZoom) + additionaloffset + ((canvasScrollLeft * additionalIEZoom) - canvasScrollLeft)); b.y = b.y - (corrSVG.f - (jQuery("#canvasSection").offset().top * additionalIEZoom) + ((canvasScrollTop * additionalIEZoom) - canvasScrollTop)); } - - + + // Fit to SVG-Coordinates a.x /= corrSVG.a; a.y /= corrSVG.d; b.x /= corrSVG.a; b.y /= corrSVG.d; - + // Calculate the elements from the childs of the canvas var elements = this.facade.getCanvas().getChildShapes(true).findAll(function(value) { var absBounds = value.absoluteBounds(); - + var bA = absBounds.upperLeft(); var bB = absBounds.lowerRight(); - + if(bA.x > a.x && bA.y > a.y && bB.x < b.x && bB.y < b.y) return true; return false; @@ -21888,9 +21888,9 @@ if(!ORYX.Plugins) }; var scrollNode = this.facade.getCanvas().rootNode.parentNode.parentNode; - size.width -= this.offsetScroll.x - scrollNode.scrollLeft; + size.width -= this.offsetScroll.x - scrollNode.scrollLeft; size.height -= this.offsetScroll.y - scrollNode.scrollTop; - + // Set the size this.resize(size); @@ -21917,7 +21917,7 @@ if(!ORYX.Plugins) // Calculate the negative offset this.setPos(this.position); this.size = Object.clone(size); - + if(size.width < 0) { this.node.style.left = (this.position.x + size.width) + "px"; size.width = - size.width; @@ -21946,58 +21946,58 @@ if(!ORYX.Plugins) */ if(!ORYX.Plugins) - ORYX.Plugins = new Object(); + ORYX.Plugins = new Object(); ORYX.Plugins.ShapeHighlighting = Clazz.extend({ construct: function(facade) { - + this.parentNode = facade.getCanvas().getSvgContainer(); - + // The parent Node this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.parentNode, ['g']); this.highlightNodes = {}; - + facade.registerOnEvent(ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, this.setHighlight.bind(this)); - facade.registerOnEvent(ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, this.hideHighlight.bind(this)); + facade.registerOnEvent(ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, this.hideHighlight.bind(this)); }, setHighlight: function(options) { if(options && options.highlightId){ var node = this.highlightNodes[options.highlightId]; - + if(!node){ node= ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ['path', { "stroke-width": 2.0, "fill":"none" - }]); - + }]); + this.highlightNodes[options.highlightId] = node; } if(options.elements && options.elements.length > 0) { - + this.setAttributesByStyle( node, options ); this.show(node); - + } else { - - this.hide(node); - + + this.hide(node); + } - + } }, - + hideHighlight: function(options) { if(options && options.highlightId && this.highlightNodes[options.highlightId]){ this.hide(this.highlightNodes[options.highlightId]); - } + } }, - + hide: function(node) { node.setAttributeNS(null, 'display', 'none'); }, @@ -22005,26 +22005,26 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ show: function(node) { node.setAttributeNS(null, 'display', ''); }, - + setAttributesByStyle: function( node, options ){ - + // If the style say, that it should look like a rectangle if( options.style && options.style == ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE ){ - + // Set like this var bo = options.elements[0].absoluteBounds(); - + var strWidth = options.strokewidth ? options.strokewidth : ORYX.CONFIG.BORDER_OFFSET - + node.setAttributeNS(null, "d", this.getPathRectangle( bo.a, bo.b , strWidth ) ); node.setAttributeNS(null, "stroke", options.color ? options.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR); node.setAttributeNS(null, "stroke-opacity", options.opacity ? options.opacity : 0.2); node.setAttributeNS(null, "stroke-width", strWidth); - - } else if(options.elements.length == 1 + + } else if(options.elements.length == 1 && options.elements[0] instanceof ORYX.Core.Edge && options.highlightId != "selection") { - + /* Highlight containment of edge's childs */ var path = this.getPathEdge(options.elements[0].dockers); if (path && path.length > 0) @@ -22034,7 +22034,7 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ node.setAttributeNS(null, "stroke", options.color ? options.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR); node.setAttributeNS(null, "stroke-opacity", options.opacity ? options.opacity : 0.2); node.setAttributeNS(null, "stroke-width", ORYX.CONFIG.OFFSET_EDGE_BOUNDS); - + }else { // If not, set just the corners var path = this.getPathByElements(options.elements); @@ -22045,18 +22045,18 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ node.setAttributeNS(null, "stroke", options.color ? options.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR); node.setAttributeNS(null, "stroke-opacity", options.opacity ? options.opacity : 1.0); node.setAttributeNS(null, "stroke-width", options.strokewidth ? options.strokewidth : 2.0); - + } }, - + getPathByElements: function(elements){ if(!elements || elements.length <= 0) {return undefined} - + // Get the padding and the size var padding = ORYX.CONFIG.SELECTED_AREA_PADDING; - + var path = "" - + // Get thru all Elements elements.each((function(element) { if(!element) {return} @@ -22065,28 +22065,28 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ bounds.widen(padding) var a = bounds.upperLeft(); var b = bounds.lowerRight(); - + path = path + this.getPath(a ,b); - + }).bind(this)); return path; - + }, getPath: function(a, b){ - + return this.getPathCorners(a, b); - + }, - + getPathCorners: function(a, b){ var size = ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE; - + var path = "" - // Set: Upper left + // Set: Upper left path = path + "M" + a.x + " " + (a.y + size) + " l0 -" + size + " l" + size + " 0 "; // Set: Lower left path = path + "M" + a.x + " " + (b.y - size) + " l0 " + size + " l" + size + " 0 "; @@ -22094,18 +22094,18 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ path = path + "M" + b.x + " " + (b.y - size) + " l0 " + size + " l-" + size + " 0 "; // Set: Upper right path = path + "M" + b.x + " " + (a.y + size) + " l0 -" + size + " l-" + size + " 0 "; - + return path; }, - + getPathRectangle: function(a, b, strokeWidth){ var size = ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE; var path = "" var offset = strokeWidth / 2.0; - - // Set: Upper left + + // Set: Upper left path = path + "M" + (a.x + offset) + " " + (a.y); path = path + " L" + (a.x + offset) + " " + (b.y - offset); path = path + " L" + (b.x - offset) + " " + (b.y - offset); @@ -22114,23 +22114,23 @@ ORYX.Plugins.ShapeHighlighting = Clazz.extend({ return path; }, - + getPathEdge: function(edgeDockers) { var length = edgeDockers.length; - var path = "M" + edgeDockers[0].bounds.center().x + " " + var path = "M" + edgeDockers[0].bounds.center().x + " " + edgeDockers[0].bounds.center().y; - + for(i=1; i 1) { this.facade.raiseEvent({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, + type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, highlightId:'selection', elements: event.elements.without(event.subSelection), color: ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR, @@ -22159,20 +22159,20 @@ ORYX.Plugins.HighlightingSelectedShapes = Clazz.extend({ if(event.subSelection){ this.facade.raiseEvent({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, + type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, highlightId:'subselection', elements: [event.subSelection], color: ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR, opacity: this.opacityFull - }); + }); } else { - this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:'subselection'}); - } - + this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:'subselection'}); + } + } else { this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:'selection'}); this.facade.raiseEvent({type:ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId:'subselection'}); - } + } } });/* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -22184,105 +22184,105 @@ ORYX.Plugins.HighlightingSelectedShapes = Clazz.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if (!ORYX.Plugins) +if (!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.Overlay = Clazz.extend({ facade: undefined, - + styleNode: undefined, - + construct: function(facade){ - + this.facade = facade; this.changes = []; this.facade.registerOnEvent(ORYX.CONFIG.EVENT_OVERLAY_SHOW, this.show.bind(this)); - this.facade.registerOnEvent(ORYX.CONFIG.EVENT_OVERLAY_HIDE, this.hide.bind(this)); + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_OVERLAY_HIDE, this.hide.bind(this)); this.styleNode = document.createElement('style') this.styleNode.setAttributeNS(null, 'type', 'text/css') - + document.getElementsByTagName('head')[0].appendChild( this.styleNode ) }, - + /** * Show the overlay for specific nodes * @param {Object} options - * - * String options.id - MUST - Define the id of the overlay (is needed for the hiding of this overlay) + * + * String options.id - MUST - Define the id of the overlay (is needed for the hiding of this overlay) * ORYX.Core.Shape[] options.shapes - MUST - Define the Shapes for the changes * attr-name:value options.changes - Defines all the changes which should be shown - * - * + * + * */ show: function( options ){ - + // Checks if all arguments are available - if( !options || + if( !options || !options.shapes || !options.shapes instanceof Array || - !options.id || !options.id instanceof String || options.id.length == 0) { - + !options.id || !options.id instanceof String || options.id.length == 0) { + return - + } - + //if( this.changes[options.id]){ // this.hide( options ) //} - + // Checked if attributes are setted if( options.attributes ){ - + // FOR EACH - Shape options.shapes.each(function(el){ - + // Checks if the node is a Shape if( !el instanceof ORYX.Core.Shape){ return } - + this.setAttributes( el.node , options.attributes ) - + }.bind(this)) - } - + } + var isSVG = true try { isSVG = options.node && options.node instanceof SVGElement; } catch(e){} - - // Checks if node is setted and if this is an SVGElement + + // Checks if node is setted and if this is an SVGElement if ( options.node && isSVG) { - + options["_temps"] = [] - + // FOR EACH - Node options.shapes.each(function(el, index){ - + // Checks if the node is a Shape if( !el instanceof ORYX.Core.Shape){ return } - + var _temp = {} _temp.svg = options.dontCloneNode ? options.node : options.node.cloneNode( true ); - + // Add the svg node to the ORYX-Shape - el.node.firstChild.appendChild( _temp.svg ) - + el.node.firstChild.appendChild( _temp.svg ) + // If if (el instanceof ORYX.Core.Edge && !options.nodePosition) { options['nodePosition'] = "START" } - + // If the node position is setted, it has to be transformed if( options.nodePosition ){ - + var b = el.bounds; var p = options.nodePosition.toUpperCase(); - + // Check the values of START and END if( el instanceof ORYX.Core.Node && p == "START"){ p = "NW"; @@ -22294,12 +22294,12 @@ ORYX.Plugins.Overlay = Clazz.extend({ b = el.getDockers().last().bounds } - // Create a callback for the changing the position + // Create a callback for the changing the position // depending on the position string _temp.callback = function(){ - + var x = 0; var y = 0; - + if( p == "NW" ){ // Do Nothing } else if( p == "N" ) { @@ -22321,122 +22321,122 @@ ORYX.Plugins.Overlay = Clazz.extend({ } else { return } - + if( el instanceof ORYX.Core.Edge){ x += b.upperLeft().x ; y += b.upperLeft().y ; } - + _temp.svg.setAttributeNS(null, "transform", "translate(" + x + ", " + y + ")") - + }.bind(this) - + _temp.element = el; _temp.callback(); - + b.registerCallback( _temp.callback ); - + } - - - options._temps.push( _temp ) - + + + options._temps.push( _temp ) + }.bind(this)) - - - - } - + + + + } + // Store the changes if( !this.changes[options.id] ){ this.changes[options.id] = []; } - + this.changes[options.id].push( options ); - + }, - + /** * Hide the overlay with the spefic id * @param {Object} options */ hide: function( options ){ - + // Checks if all arguments are available - if( !options || + if( !options || !options.id || !options.id instanceof String || options.id.length == 0 || - !this.changes[options.id]) { - + !this.changes[options.id]) { + return - - } - - + + } + + // Delete all added attributes // FOR EACH - Shape this.changes[options.id].each(function(option){ - + option.shapes.each(function(el, index){ - + // Checks if the node is a Shape if( !el instanceof ORYX.Core.Shape){ return } - + this.deleteAttributes( el.node ) - + }.bind(this)); - + if( option._temps ){ - + option._temps.each(function(tmp){ // Delete the added Node, if there is one if( tmp.svg && tmp.svg.parentNode ){ tmp.svg.parentNode.removeChild( tmp.svg ) } - - // If + + // If if( tmp.callback && tmp.element){ // It has to be unregistered from the edge tmp.element.bounds.unregisterCallback( tmp.callback ) } - + }.bind(this)) - + } - - + + }.bind(this)); - + this.changes[options.id] = null; - - + + }, - - + + /** * Set the given css attributes to that node * @param {HTMLElement} node * @param {Object} attributes */ setAttributes: function( node, attributes ) { - - + + // Get all the childs from ME var childs = this.getAllChilds( node.firstChild.firstChild ) - + var ids = [] - + // Add all Attributes which have relation to another node in this document and concate the pure id out of it // This is for example important for the markers of a edge childs.each(function(e){ ids.push( $A(e.attributes).findAll(function(attr){ return attr.nodeValue.startsWith('url(#')}) )}) ids = ids.flatten().compact(); ids = ids.collect(function(s){return s.nodeValue}).uniq(); ids = ids.collect(function(s){return s.slice(5, s.length-1)}) - + // Add the node ID to the id ids.unshift( node.id + ' .me') - + var attr = $H(attributes); var attrValue = attr.toJSON().gsub(',', ';').gsub('"', ''); var attrMarkerValue = attributes.stroke ? attrValue.slice(0, attrValue.length-1) + "; fill:" + attributes.stroke + ";}" : attrValue; @@ -22446,48 +22446,48 @@ ORYX.Plugins.Overlay = Clazz.extend({ copyAttr.fill = "black"; attrTextValue = $H(copyAttr).toJSON().gsub(',', ';').gsub('"', ''); } - + // Create the CSS-Tags Style out of the ids and the attributes csstags = ids.collect(function(s, i){return "#" + s + " * " + (!i? attrValue : attrMarkerValue) + "" + (attrTextValue ? " #" + s + " text * " + attrTextValue : "") }) - + // Join all the tags - var s = csstags.join(" ") + "\n" - + var s = csstags.join(" ") + "\n" + // And add to the end of the style tag this.styleNode.appendChild(document.createTextNode(s)); - - + + }, - + /** * Deletes all attributes which are * added in a special style sheet for that node - * @param {HTMLElement} node + * @param {HTMLElement} node */ deleteAttributes: function( node ) { - - // Get all children which contains the node id + + // Get all children which contains the node id var delEl = $A(this.styleNode.childNodes) .findAll(function(e){ return e.textContent.include( '#' + node.id ) }); - + // Remove all of them delEl.each(function(el){ el.parentNode.removeChild(el); - }); + }); }, - + getAllChilds: function( node ){ - + var childs = $A(node.childNodes) - - $A(node.childNodes).each(function( e ){ + + $A(node.childNodes).each(function( e ){ childs.push( this.getAllChilds( e ) ) }.bind(this)) return childs.flatten(); } - + }); /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -22499,18 +22499,18 @@ ORYX.Plugins.Overlay = Clazz.extend({ * All code Copyright 2013 KIS Consultancy all rights reserved */ -if (!ORYX.Plugins) +if (!ORYX.Plugins) ORYX.Plugins = new Object(); ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ facade: undefined, - + construct: function(facade){ - + this.facade = facade; this.copyElements = []; - + //this.facade.registerOnEvent(ORYX.CONFIG.EVENT_KEYDOWN, this.keyHandler.bind(this)); // SELECT ALL @@ -22518,99 +22518,99 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ keyCodes: [{ metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL], keyCode: 65, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.selectAll.bind(this) }); - - // MOVE LEFT SMALL + + // MOVE LEFT SMALL this.facade.offer({ keyCodes: [{ metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL], keyCode: ORYX.CONFIG.KEY_CODE_LEFT, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_LEFT, false) }); - + // MOVE LEFT this.facade.offer({ keyCodes: [{ keyCode: ORYX.CONFIG.KEY_CODE_LEFT, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_LEFT, true) }); - - // MOVE RIGHT SMALL + + // MOVE RIGHT SMALL this.facade.offer({ keyCodes: [{ metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL], keyCode: ORYX.CONFIG.KEY_CODE_RIGHT, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_RIGHT, false) }); - - // MOVE RIGHT + + // MOVE RIGHT this.facade.offer({ keyCodes: [{ keyCode: ORYX.CONFIG.KEY_CODE_RIGHT, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_RIGHT, true) }); - - // MOVE UP SMALL + + // MOVE UP SMALL this.facade.offer({ keyCodes: [{ metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL], keyCode: ORYX.CONFIG.KEY_CODE_UP, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_UP, false) }); - - // MOVE UP + + // MOVE UP this.facade.offer({ keyCodes: [{ keyCode: ORYX.CONFIG.KEY_CODE_UP, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_UP, true) }); - - // MOVE DOWN SMALL + + // MOVE DOWN SMALL this.facade.offer({ keyCodes: [{ metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL], keyCode: ORYX.CONFIG.KEY_CODE_DOWN, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_DOWN, false) }); - - // MOVE DOWN + + // MOVE DOWN this.facade.offer({ keyCodes: [{ keyCode: ORYX.CONFIG.KEY_CODE_DOWN, - keyAction: ORYX.CONFIG.KEY_ACTION_DOWN + keyAction: ORYX.CONFIG.KEY_ACTION_DOWN } ], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_DOWN, true) }); - - + + }, - + /** * Select all shapes in the editor * @@ -22619,9 +22619,9 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ Event.stop(e.event); this.facade.setSelection(this.facade.getCanvas().getChildShapes(true)) }, - + move: function(key, far, e) { - + Event.stop(e.event); // calculate the distance to move the objects and get the selection. @@ -22629,7 +22629,7 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ var selection = this.facade.getSelection(); var currentSelection = this.facade.getSelection(); var p = {x: 0, y: 0}; - + // switch on the key pressed and populate the point to move by. switch(key) { @@ -22646,28 +22646,28 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ p.y = distance; break; } - + // move each shape in the selection by the point calculated and update it. - selection = selection.findAll(function(shape){ - // Check if this shape is docked to an shape in the selection - if(shape instanceof ORYX.Core.Node && shape.dockers.length == 1 && selection.include( shape.dockers.first().getDockedShape() )){ - return false - } - + selection = selection.findAll(function(shape){ + // Check if this shape is docked to an shape in the selection + if(shape instanceof ORYX.Core.Node && shape.dockers.length == 1 && selection.include( shape.dockers.first().getDockedShape() )){ + return false + } + // Check if any of the parent shape is included in the selection - var s = shape.parent; - do{ - if(selection.include(s)){ + var s = shape.parent; + do{ + if(selection.include(s)){ return false } - }while(s = s.parent); - + }while(s = s.parent); + // Otherwise, return true return true; - + }); - - /* Edges must not be movable, if only edges are selected and at least + + /* Edges must not be movable, if only edges are selected and at least * one of them is docked. */ var edgesMovable = true; @@ -22676,17 +22676,17 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ if(shape.isDocked()) { edgesMovable = false; } - return true; + return true; } return false; }); - + if(onlyEdgesSelected && !edgesMovable) { /* Abort moving shapes */ return; } - - selection = selection.map(function(shape){ + + selection = selection.map(function(shape){ if( shape instanceof ORYX.Core.Node ){ /*if( shape.dockers.length == 1 ){ return shape.dockers.first() @@ -22694,9 +22694,9 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ return shape //} } else if( shape instanceof ORYX.Core.Edge ) { - + var dockers = shape.dockers; - + if( selection.include( shape.dockers.first().getDockedShape() ) ){ dockers = dockers.without( shape.dockers.first() ) } @@ -22704,17 +22704,17 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ if( selection.include( shape.dockers.last().getDockedShape() ) ){ dockers = dockers.without( shape.dockers.last() ) } - - return dockers - + + return dockers + } else { return null } - + }).flatten().compact(); - + if (selection.size() > 0) { - + //Stop moving at canvas borders var selectionBounds = [ this.facade.getCanvas().bounds.lowerRight().x, this.facade.getCanvas().bounds.lowerRight().y, @@ -22734,23 +22734,23 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ p.x = this.facade.getCanvas().bounds.lowerRight().x - selectionBounds[2]; if(selectionBounds[3]+p.y > this.facade.getCanvas().bounds.lowerRight().y) p.y = this.facade.getCanvas().bounds.lowerRight().y - selectionBounds[3]; - + if(p.x!=0 || p.y!=0) { // Instantiate the moveCommand var commands = [new ORYX.Core.Command.Move(selection, p, null, currentSelection, this)]; - // Execute the commands + // Execute the commands this.facade.executeCommands(commands); } - + } }, - + getUndockedCommant: function(shapes){ var undockEdgeCommand = ORYX.Core.Command.extend({ construct: function(moveShapes){ this.dockers = moveShapes.collect(function(shape){ return shape instanceof ORYX.Core.Controls.Docker ? {docker:shape, dockedShape:shape.getDockedShape(), refPoint:shape.referencePoint} : undefined }).compact(); - }, + }, execute: function(){ this.dockers.each(function(el){ el.docker.setDockedShape(undefined); @@ -22764,12 +22764,12 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ }) } }); - + command = new undockEdgeCommand( shapes ); - command.execute(); + command.execute(); return command; }, - + // /** // * The key handler for this plugin. Every action from the set of cut, copy, // * paste and delete should be accessible trough simple keyboard shortcuts. @@ -22780,13 +22780,13 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ // */ // keyHandler: function(event){ // //TODO document what event.which is. -// +// // ORYX.Log.debug("keysMove.js handles a keyEvent."); -// +// // // assure we have the current event. -// if (!event) +// if (!event) // event = window.event; -// +// // // get the currently pressed key and state of control key. // var pressedKey = event.which || event.keyCode; // var ctrlPressed = event.ctrlKey; @@ -22794,13 +22794,13 @@ ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({ // // if the key is one of the arrow keys, forward to move and return. // if ([ORYX.CONFIG.KEY_CODE_LEFT, ORYX.CONFIG.KEY_CODE_RIGHT, // ORYX.CONFIG.KEY_CODE_UP, ORYX.CONFIG.KEY_CODE_DOWN].include(pressedKey)) { -// +// // this.move(pressedKey, !ctrlPressed); // return; // } -// +// // } - + }); /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -22816,30 +22816,30 @@ if(!ORYX.Plugins) { ORYX.Plugins = {} } if(!ORYX.Plugins.Layouter) { ORYX.Plugins.Layouter = {} } new function(){ - + /** * Edge layouter is an implementation to layout an edge * @class ORYX.Plugins.Layouter.EdgeLayouter * @author Willi Tscheschner */ ORYX.Plugins.Layouter.EdgeLayouter = ORYX.Plugins.AbstractLayouter.extend({ - + /** * Layout only Edges */ - layouted : [ "http://b3mn.org/stencilset/bpmn1.1#SequenceFlow", + layouted : [ "http://b3mn.org/stencilset/bpmn1.1#SequenceFlow", "http://b3mn.org/stencilset/bpmn1.1#MessageFlow", - "http://b3mn.org/stencilset/timjpdl3#SequenceFlow", - "http://b3mn.org/stencilset/jbpm4#SequenceFlow", + "http://b3mn.org/stencilset/timjpdl3#SequenceFlow", + "http://b3mn.org/stencilset/jbpm4#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0#MessageFlow", - "http://b3mn.org/stencilset/bpmn2.0#SequenceFlow", + "http://b3mn.org/stencilset/bpmn2.0#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0choreography#MessageFlow", - "http://b3mn.org/stencilset/bpmn2.0choreography#SequenceFlow", + "http://b3mn.org/stencilset/bpmn2.0choreography#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0conversation#ConversationLink", "http://b3mn.org/stencilset/epc#ControlFlow", "http://www.signavio.com/stencilsets/processmap#ProcessLink", "http://www.signavio.com/stencilsets/organigram#connection"], - + /** * Layout a set on edges * @param {Object} edges @@ -22849,54 +22849,54 @@ new function(){ this.doLayout(edge) }.bind(this)) }, - + /** * Layout one edge * @param {Object} edge */ doLayout: function(edge){ // Get from and to node - var from = edge.getIncomingNodes()[0]; + var from = edge.getIncomingNodes()[0]; var to = edge.getOutgoingNodes()[0]; - + // Return if one is null if (!from || !to) { return } - + var positions = this.getPositions(from, to, edge); - + if (positions.length > 0){ this.setDockers(edge, positions[0].a, positions[0].b); } - + }, - + /** - * Returns a set on positions which are not containt either + * Returns a set on positions which are not containt either * in the bounds in from or to. * @param {Object} from Shape where the edge is come from * @param {Object} to Shape where the edge is leading to * @param {Object} edge Edge between from and to */ getPositions : function(from, to, edge){ - + // Get absolute bounds var ab = from.absoluteBounds(); var bb = to.absoluteBounds(); - + // Get center from and to var a = ab.center(); var b = bb.center(); - + var am = ab.midPoint(); var bm = bb.midPoint(); - + // Get first and last reference point var first = Object.clone(edge.dockers.first().referencePoint); var last = Object.clone(edge.dockers.last().referencePoint); // Get the absolute one var aFirst = edge.dockers.first().getAbsoluteReferencePoint(); - var aLast = edge.dockers.last().getAbsoluteReferencePoint(); - + var aLast = edge.dockers.last().getAbsoluteReferencePoint(); + // IF ------> // or | // V @@ -22904,26 +22904,26 @@ new function(){ if (Math.abs(aFirst.x-aLast.x) < 1 || Math.abs(aFirst.y-aLast.y) < 1) { return [] } - + // Calc center position, between a and b // depending on there weight var m = {} - m.x = a.x < b.x ? - (((b.x - bb.width()/2) - (a.x + ab.width()/2))/2) + (a.x + ab.width()/2): + m.x = a.x < b.x ? + (((b.x - bb.width()/2) - (a.x + ab.width()/2))/2) + (a.x + ab.width()/2): (((a.x - ab.width()/2) - (b.x + bb.width()/2))/2) + (b.x + bb.width()/2); - m.y = a.y < b.y ? - (((b.y - bb.height()/2) - (a.y + ab.height()/2))/2) + (a.y + ab.height()/2): + m.y = a.y < b.y ? + (((b.y - bb.height()/2) - (a.y + ab.height()/2))/2) + (a.y + ab.height()/2): (((a.y - ab.height()/2) - (b.y + bb.height()/2))/2) + (b.y + bb.height()/2); - - + + // Enlarge both bounds with 10 - ab.widen(5); // Wide the from less than + ab.widen(5); // Wide the from less than bb.widen(20);// the to because of the arrow from the edge - + var positions = []; var off = this.getOffset.bind(this); - + // Checks ----+ // | // V @@ -22933,8 +22933,8 @@ new function(){ z : this.getWeight(from, a.x < b.x ? "r" : "l", to, a.y < b.y ? "t" : "b", edge) }); } - - // Checks | + + // Checks | // +---> if (!ab.isIncluded(a.x, b.y)&&!bb.isIncluded(a.x, b.y)) { positions.push({ @@ -22942,7 +22942,7 @@ new function(){ z : this.getWeight(from, a.y < b.y ? "b" : "t", to, a.x < b.x ? "l" : "r", edge) }); } - + // Checks --+ // | // +---> @@ -22953,8 +22953,8 @@ new function(){ z : this.getWeight(from, "r", to, "l", edge, a.x > b.x) }); } - - // Checks | + + // Checks | // +---+ // | // V @@ -22964,15 +22964,15 @@ new function(){ b : {x:b.x+off(last,bm,"x"),y:m.y}, z : this.getWeight(from, "b", to, "t", edge, a.y > b.y) }); - } - + } + // Sort DESC of weights return positions.sort(function(a,b){ return a.z < b.z ? 1 : (a.z == b.z ? -1 : -1)}); }, - + /** * Returns a offset for the pos to the center of the bounds - * + * * @param {Object} val * @param {Object} pos2 * @param {String} dir Direction x|y @@ -22980,10 +22980,10 @@ new function(){ getOffset: function(pos, pos2, dir){ return pos[dir] - pos2[dir]; }, - + /** * Returns a value which shows the weight for this configuration - * + * * @param {Object} from Shape which is coming from * @param {String} d1 Direction where is goes * @param {Object} to Shape which goes to @@ -22992,21 +22992,21 @@ new function(){ * @param {Boolean} reverse Reverse the direction (e.g. "r" -> "l") */ getWeight: function(from, d1, to, d2, edge, reverse){ - + d1 = (d1||"").toLowerCase(); d2 = (d2||"").toLowerCase(); - + if (!["t","r","b","l"].include(d1)){ d1 = "r"} if (!["t","r","b","l"].include(d2)){ d1 = "l"} - + // If reverse is set if (reverse) { // Reverse d1 and d2 d1 = d1=="t"?"b":(d1=="r"?"l":(d1=="b"?"t":(d1=="l"?"r":"r"))) d2 = d2=="t"?"b":(d2=="r"?"l":(d2=="b"?"t":(d2=="l"?"r":"r"))) } - - + + var weight = 0; // Get rules for from "out" and to "in" var dr1 = this.facade.getRules().getLayoutingRules(from, edge)["out"]; @@ -23036,7 +23036,7 @@ new function(){ var sameIncomingFrom = from .getIncomingShapes() .findAll(function(a){ return a instanceof ORYX.Core.Edge}) - .any(function(e){ + .any(function(e){ return sameDirection(d1, e.dockers[e.dockers.length-2].bounds.center(), e.dockers.last().bounds.center()); }); @@ -23044,20 +23044,20 @@ new function(){ var sameOutgoingTo = to .getOutgoingShapes() .findAll(function(a){ return a instanceof ORYX.Core.Edge}) - .any(function(e){ + .any(function(e){ return sameDirection(d2, e.dockers[1].bounds.center(), e.dockers.first().bounds.center()); }); - + // If there are equivalent edges, set 0 //fromWeight = sameIncomingFrom ? 0 : fromWeight; //toWeight = sameOutgoingTo ? 0 : toWeight; - - // Get the sum of "out" and the direction plus "in" and the direction + + // Get the sum of "out" and the direction plus "in" and the direction return (sameIncomingFrom||sameOutgoingTo?0:fromWeight+toWeight); }, - + /** - * Removes all current dockers from the node + * Removes all current dockers from the node * (except the start and end) and adds two new * dockers, on the position a and b. * @param {Object} edge @@ -23066,33 +23066,33 @@ new function(){ */ setDockers: function(edge, a, b){ if (!edge){ return } - + // Remove all dockers (implicit, // start and end dockers will not removed) edge.dockers.each(function(r){ edge.removeDocker(r); }); - + // For a and b (if exists), create // a new docker and set position [a, b].compact().each(function(pos){ var docker = edge.createDocker(undefined, pos); docker.bounds.centerMoveTo(pos); }); - + // Update all dockers from the edge edge.dockers.each(function(docker){ docker.update() }) - + // Update edge //edge.refresh(); edge._update(true); - + } }); - - + + }() /* * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. @@ -23108,28 +23108,28 @@ if(!ORYX.Plugins) ORYX.Plugins = new Object(); new function(){ - + ORYX.Plugins.BPMN2_0 = { - + /** * Constructor * @param {Object} Facade: The Facade of the Editor */ construct: function(facade){ this.facade = facade; - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED, this.handleDockerDocked.bind(this)); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_PROPWINDOW_PROP_CHANGED, this.handlePropertyChanged.bind(this)); this.facade.registerOnEvent('layout.bpmn2_0.pool', this.handleLayoutPool.bind(this)); this.facade.registerOnEvent('layout.bpmn2_0.subprocess', this.handleSubProcess.bind(this)); this.facade.registerOnEvent(ORYX.CONFIG.EVENT_SHAPEREMOVED, this.handleShapeRemove.bind(this)); - + this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADED, this.afterLoad.bind(this)); - + this.namespace = undefined; }, - + /** * Force to update every pool */ @@ -23142,14 +23142,14 @@ new function(){ } }.bind(this)) }, - + /** * If a pool is selected and contains no lane, * a lane is created automagically */ onSelectionChanged: function(event) { var selection = event.elements; - + if(selection && selection.length === 1) { var namespace = this.getNamespace(); var shape = selection[0]; @@ -23168,19 +23168,19 @@ new function(){ } } } - + // Preventing selection of all lanes but not the pool if(selection.any(function(s){ return s instanceof ORYX.Core.Node && s.getStencil().id().endsWith("Lane")})){ var lanes = selection.findAll(function(s){ return s instanceof ORYX.Core.Node && s.getStencil().id().endsWith("Lane") }); - + var pools = []; var unselectLanes = []; lanes.each(function(lane){ pools.push(this.getParentPool(lane)) }.bind(this)); - + pools = pools.uniq().findAll(function(pool){ var childLanes = this.getLanes(pool, true); if (childLanes.all(function(lane){ return lanes.include(lane)})){ @@ -23193,7 +23193,7 @@ new function(){ return false; } }.bind(this)) - + if (unselectLanes.length > 0 && pools.length > 0){ selection = selection.without.apply(selection, unselectLanes); selection = selection.concat(pools); @@ -23201,34 +23201,34 @@ new function(){ } } }, - + handleShapeRemove: function(option) { - + var sh = option.shape; var parent = option.parent; - + if (sh instanceof ORYX.Core.Node && sh.getStencil().idWithoutNs() === "Lane" && this.facade.isExecutingCommands()) { - + var pool = this.getParentPool(parent); - if (pool&&pool.parent){ - + if (pool&&pool.parent){ + var isLeafFn = function(leaf){ return !leaf.getChildNodes().any(function(r){ return r.getStencil().idWithoutNs() === "Lane"}); } - + var isLeaf = isLeafFn(sh); var parentHasMoreLanes = parent.getChildNodes().any(function(r){ return r.getStencil().idWithoutNs() === "Lane"}); - + if (isLeaf && parentHasMoreLanes){ - + var command = new ResizeLanesCommand(sh, parent, pool, this); this.facade.executeCommands([command]); - + } else if( !isLeaf && !this.facade.getSelection().any(function(select){ // Find one of the selection, which is a lane and child of "sh" and is a leaf lane return select instanceof ORYX.Core.Node && select.getStencil().idWithoutNs() === "Lane" && select.isParent(sh) && isLeafFn(select);})) { - + var Command = ORYX.Core.Command.extend({ construct: function(shape, facade) { this.children = shape.getChildNodes(true); @@ -23248,19 +23248,19 @@ new function(){ } }); this.facade.executeCommands([new Command(sh, this.facade)]); - + } else if (isLeaf&&!parentHasMoreLanes&&parent == pool){ parent.add(sh); } } - + } - + }, - + hashedSubProcesses: {}, - + hashChildShapes: function(shape){ var children = shape.getChildNodes(); children.each(function(child){ @@ -23272,49 +23272,49 @@ new function(){ } }.bind(this)); }, - + /** * Handle the layouting of a sub process. - * Mainly to adjust the child dockers of a sub process. + * Mainly to adjust the child dockers of a sub process. * */ handleSubProcess : function(option) { - + var sh = option.shape; - + if (!this.hashedSubProcesses[sh.id]) { this.hashedSubProcesses[sh.id] = sh.absoluteXY(); this.hashedSubProcesses[sh.id].width = sh.bounds.width(); this.hashedSubProcesses[sh.id].height = sh.bounds.height(); return; } - + var offset = sh.absoluteXY(); offset.x -= this.hashedSubProcesses[sh.id].x; offset.y -= this.hashedSubProcesses[sh.id].y; - + var resized = this.hashedSubProcesses[sh.id].width !== sh.bounds.width() || this.hashedSubProcesses[sh.id].height !== sh.bounds.height(); - + this.hashedSubProcesses[sh.id] = sh.absoluteXY(); this.hashedSubProcesses[sh.id].width = sh.bounds.width(); this.hashedSubProcesses[sh.id].height = sh.bounds.height(); this.hashChildShapes(sh); - - + + // Move dockers only if currently is not resizing if (this.facade.isExecutingCommands()&&!resized) { this.moveChildDockers(sh, offset); } }, - + moveChildDockers: function(shape, offset){ - + if (!offset.x && !offset.y) { return; - } - + } + var children = shape.getChildNodes(true); - + // Get all nodes var dockers = children // Get all incoming and outgoing edges @@ -23328,38 +23328,38 @@ new function(){ .uniq() // Get all dockers .map(function(edge){ - return edge.dockers.length > 2 ? - edge.dockers.slice(1, edge.dockers.length-1) : + return edge.dockers.length > 2 ? + edge.dockers.slice(1, edge.dockers.length-1) : []; }) // Flatten the dockers lists .flatten(); - + var abs = shape.absoluteBounds(); abs.moveBy(-offset.x, -offset.y) var obj = {}; dockers.each(function(docker){ - + if (docker.isChanged){ return; } - + var off = Object.clone(offset); - + if (!abs.isIncluded(docker.bounds.center())){ var index = docker.parent.dockers.indexOf(docker); var size = docker.parent.dockers.length; var from = docker.parent.getSource(); var to = docker.parent.getTarget(); - + var bothAreIncluded = children.include(from) && children.include(to); - + if (!bothAreIncluded){ var previousIsOver = index !== 0 ? abs.isIncluded(docker.parent.dockers[index-1].bounds.center()) : false; var nextIsOver = index !== size-1 ? abs.isIncluded(docker.parent.dockers[index+1].bounds.center()) : false; - + if (!previousIsOver && !nextIsOver){ return; } - + var ref = docker.parent.dockers[previousIsOver ? index-1 : index+1]; if (Math.abs(-Math.abs(ref.bounds.center().x-docker.bounds.center().x)) < 2){ off.y = 0; @@ -23369,151 +23369,151 @@ new function(){ return; } } - + } - + obj[docker.getId()] = { docker:docker, offset:off } }) - + // Set dockers this.facade.executeCommands([new ORYX.Core.MoveDockersCommand(obj)]); - + }, - + /** * DragDocker.Docked Handler * - */ + */ handleDockerDocked: function(options) { var namespace = this.getNamespace(); - + var edge = options.parent; var edgeSource = options.target; - + if(edge.getStencil().id() === namespace + "SequenceFlow") { var isGateway = edgeSource.getStencil().groups().find(function(group) { - if(group == "Gateways") + if(group == "Gateways") return group; }); if(!isGateway && (edge.properties["oryx-conditiontype"] == "Expression")) // show diamond on edge source edge.setProperty("oryx-showdiamondmarker", true); - else + else // do not show diamond on edge source edge.setProperty("oryx-showdiamondmarker", false); - + // update edge rendering //edge.update(); - + this.facade.getCanvas().update(); } }, - + /** * PropertyWindow.PropertyChanged Handler */ handlePropertyChanged: function(option) { var namespace = this.getNamespace(); - + var shapes = option.elements; var propertyKey = option.key; var propertyValue = option.value; - + var changed = false; shapes.each(function(shape){ if((shape.getStencil().id() === namespace + "SequenceFlow") && (propertyKey === "oryx-conditiontype")) { - + if(propertyValue != "Expression") // Do not show the Diamond shape.setProperty("oryx-showdiamondmarker", false); else { var incomingShapes = shape.getIncomingShapes(); - + if(!incomingShapes) { shape.setProperty("oryx-showdiamondmarker", true); } - + var incomingGateway = incomingShapes.find(function(aShape) { var foundGateway = aShape.getStencil().groups().find(function(group) { - if(group == "Gateways") + if(group == "Gateways") return group; }); if(foundGateway) return foundGateway; }); - - if(!incomingGateway) + + if(!incomingGateway) // show diamond on edge source shape.setProperty("oryx-showdiamondmarker", true); else // do not show diamond shape.setProperty("oryx-showdiamondmarker", false); } - + changed = true; } }.bind(this)); - + if(changed) {this.facade.getCanvas().update();} - + }, - + hashedPoolPositions : {}, hashedLaneDepth : {}, hashedBounds : {}, hashedPositions: {}, - + /** * Handler for layouting event 'layout.bpmn2_0.pool' * @param {Object} event */ handleLayoutPool: function(event){ - - + + var pool = event.shape; var selection = this.facade.getSelection(); var currentShape = selection.include(pool) ? pool : selection.first(); - + currentShape = currentShape || pool; - + this.currentPool = pool; - + // Check if it is a pool or a lane if (!(currentShape.getStencil().id().endsWith("Pool") || currentShape.getStencil().id().endsWith("Lane"))) { return; } - + // Check if the lane is within the pool and is not removed lately if (currentShape !== pool && !currentShape.isParent(pool) && !this.hashedBounds[pool.id][currentShape.id]){ return; } - - + + if (!this.hashedBounds[pool.id]) { this.hashedBounds[pool.id] = {}; } - + // Find all child lanes var lanes = this.getLanes(pool); - + if (lanes.length <= 0) { return } - + var allLanes = this.getLanes(pool, true), hp; var considerForDockers = allLanes.clone(); - + var hashedPositions = $H({}); allLanes.each(function(lane){ hashedPositions[lane.id] = lane.bounds.upperLeft(); }) - - - + + + // Show/hide caption regarding the number of lanes if (lanes.length === 1 && this.getLanes(lanes.first()).length <= 0) { // TRUE if there is a caption @@ -23527,10 +23527,10 @@ new function(){ rect[0].removeAttributeNS(null, "display"); }) } - + var deletedLanes = []; var addedLanes = []; - + // Get all new lanes var i=-1; while (++i 0){ currentShape = addedLanes.first(); } - - + + // Get all deleted lanes var resourceIds = $H(this.hashedBounds[pool.id]).keys(); var i=-1; @@ -23552,12 +23552,12 @@ new function(){ deletedLanes.push(this.hashedBounds[pool.id][resourceIds[i]]); selection = selection.without(function(r){ return r.id == resourceIds[i] }); } - } - + } + var height, width, x, y; - + if (deletedLanes.length > 0 || addedLanes.length > 0) { - + if (addedLanes.length === 1 && this.getLanes(addedLanes[0].parent).length === 1){ // Set height from the pool height = this.adjustHeight(lanes, addedLanes[0].parent); @@ -23566,16 +23566,16 @@ new function(){ height = this.updateHeight(pool); } // Set width from the pool - width = this.adjustWidth(lanes, pool.bounds.width()); - + width = this.adjustWidth(lanes, pool.bounds.width()); + pool.update(); } - + /** * Set width/height depending on the pool */ else if (pool == currentShape) { - + if (selection.length === 1 && this.isResized(pool, this.hashedPoolPositions[pool.id])) { var oldXY = this.hashedPoolPositions[pool.id].upperLeft(); var xy = pool.bounds.upperLeft(); @@ -23584,34 +23584,34 @@ new function(){ var old = this.hashedPoolPositions[pool.id]; scale = old.height()/pool.bounds.height(); } - + this.adjustLanes(pool, allLanes, oldXY.x - xy.x, oldXY.y - xy.y, scale); } - + // Set height from the pool height = this.adjustHeight(lanes, undefined, pool.bounds.height()); // Set width from the pool - width = this.adjustWidth(lanes, pool.bounds.width()); + width = this.adjustWidth(lanes, pool.bounds.width()); } - + /**??? * Set width/height depending on containing lanes - */ + */ else { - + // Reposition the pool if one shape is selected and the upperleft has changed if (selection.length === 1 && this.isResized(currentShape, this.hashedBounds[pool.id][currentShape.id])){ var oldXY = this.hashedBounds[pool.id][currentShape.id].upperLeft(); var xy = currentShape.absoluteXY(); x = oldXY.x - xy.x; y = oldXY.y - xy.y; - + // Adjust all other lanes beneath this lane if (x||y){ considerForDockers = considerForDockers.without(currentShape); this.adjustLanes(pool, this.getAllExcludedLanes(pool, currentShape), x, 0); } - + // Adjust all child lanes var childLanes = this.getLanes(currentShape, true); if (childLanes.length > 0){ @@ -23624,34 +23624,34 @@ new function(){ } } } - + // Cache all bounds var changes = allLanes.map(function(lane){ return { shape: lane, bounds: lane.bounds.clone() } }); - + // Get height and adjust child heights height = this.adjustHeight(lanes, currentShape); // Check if something has changed and maybe create a command this.checkForChanges(allLanes, changes); - + // Set width from the current shape width = this.adjustWidth(lanes, currentShape.bounds.width()+(this.getDepth(currentShape,pool)*30)); } - + this.setDimensions(pool, width, height, x, y); - - + + if (this.facade.isExecutingCommands() && (deletedLanes.length === 0 || addedLanes.length !== 0)){ // Update all dockers this.updateDockers(considerForDockers, pool); - + // Check if the order has changed if (this.hashedPositions[pool.id] && this.hashedPositions[pool.id].keys().any(function(key, i){ return (allLanes[i]||{}).id !== key; })){ - + var LanesHasBeenReordered = ORYX.Core.Command.extend({ construct: function(originPosition, newPosition, lanes, plugin, poolId) { this.originPosition = Object.clone(originPosition); @@ -23678,46 +23678,46 @@ new function(){ this.plugin.hashedPositions[this.pool] = Object.clone(this.originPosition); } }); - + var hp2 = $H({}); allLanes.each(function(lane){ hp2[lane.id] = lane.bounds.upperLeft(); }) - + var command = new LanesHasBeenReordered(hashedPositions, hp2, allLanes, this, pool.id); this.facade.executeCommands([command]); - + } } - + this.hashedBounds[pool.id] = {}; this.hashedPositions[pool.id] = hashedPositions; - + var i=-1; while (++i < allLanes.length) { // Cache positions this.hashedBounds[pool.id][allLanes[i].id] = allLanes[i].absoluteBounds(); - + // Cache also the bounds of child shapes, mainly for child subprocesses this.hashChildShapes(allLanes[i]); - + this.hashedLaneDepth[allLanes[i].id] = this.getDepth(allLanes[i], pool); - + this.forceToUpdateLane(allLanes[i]); } - + this.hashedPoolPositions[pool.id] = pool.bounds.clone(); - - + + // Update selection - //this.facade.setSelection(selection); + //this.facade.setSelection(selection); }, - + shouldScale: function(element){ var childLanes = element.getChildNodes().findAll(function(shape){ return shape.getStencil().id().endsWith("Lane") }) return childLanes.length > 1 || childLanes.any(function(lane){ return this.shouldScale(lane) }.bind(this)) }, - + /** * Lookup if some bounds has changed * @param {Object} lanes @@ -23728,7 +23728,7 @@ new function(){ if (this.facade.isExecutingCommands() && changes.any(function(change){ return change.shape.bounds.toString() !== change.bounds.toString(); })){ - + var Command = ORYX.Core.Command.extend({ construct: function(changes) { this.oldState = changes; @@ -23749,25 +23749,25 @@ new function(){ }) } }); - + this.facade.executeCommands([new Command(changes)]); } }, - + isResized: function(shape, bounds){ - + if (!bounds||!shape){ return false; } - + var oldB = bounds; //var oldXY = oldB.upperLeft(); //var xy = shape.absoluteXY(); return Math.round(oldB.width() - shape.bounds.width()) !== 0 || Math.round(oldB.height() - shape.bounds.height()) !== 0 }, - + adjustLanes: function(pool, lanes, x, y, scale){ - + scale = scale || 0; // For every lane, adjust the child nodes with the offset @@ -23776,11 +23776,11 @@ new function(){ if (!child.getStencil().id().endsWith("Lane")){ var cy = scale ? child.bounds.center().y - (child.bounds.center().y/scale) : -y; child.bounds.moveBy((x||0), -cy); - + if (scale&&child.getStencil().id().endsWith("Subprocess")) { this.moveChildDockers(child, {x:(0), y:-cy}); } - + } }.bind(this)); this.hashedBounds[pool.id][l.id].moveBy(-(x||0), !scale?-y:0); @@ -23788,9 +23788,9 @@ new function(){ l.isScaled = true; } }.bind(this)) - + }, - + getAllExcludedLanes: function(parent, lane){ var lanes = []; parent.getChildNodes().each(function(shape){ @@ -23801,19 +23801,19 @@ new function(){ }.bind(this)); return lanes; }, - - + + forceToUpdateLane: function(lane){ - - if (lane.bounds.height() !== lane._svgShapes[0].height) { + + if (lane.bounds.height() !== lane._svgShapes[0].height) { lane.isChanged = true; lane.isResized = true; lane._update(); } }, - + getDepth: function(child, parent){ - + var i=0; while(child && child.parent && child !== parent){ child = child.parent; @@ -23821,21 +23821,21 @@ new function(){ } return i; }, - + updateDepth: function(lane, fromDepth, toDepth){ - + var xOffset = (fromDepth - toDepth) * 30; - + lane.getChildNodes().each(function(shape){ shape.bounds.moveBy(xOffset, 0); - + [].concat(children[j].getIncomingShapes()) .concat(children[j].getOutgoingShapes()) - + }) - + }, - + setDimensions: function(shape, width, height, x, y){ var isLane = shape.getStencil().id().endsWith("Lane"); // Set the bounds @@ -23848,47 +23848,47 @@ new function(){ }, setLanePosition: function(shape, y){ - + shape.bounds.moveTo(30, y); - + }, - + adjustWidth: function(lanes, width) { - + // Set width to each lane (lanes||[]).each(function(lane){ this.setDimensions(lane, width); this.adjustWidth(this.getLanes(lane), width-30); }.bind(this)); - + return width; }, - - + + adjustHeight: function(lanes, changedLane, propagateHeight){ - + var oldHeight = 0; if (!changedLane && propagateHeight){ var i=-1; - while (++i buy ? 1: 0); } - + // Check if upper left and lower right is completely above/below var above = auy < buy && aly < bly; var below = auy > buy && aly > bly; @@ -24185,15 +24185,15 @@ new function(){ // Check if a is below b including the old values var slightlyBelowBottom = auy > buy && aly <= bly && oaly > obly; var slightlyBelowTop = auy <= buy && aly > bly && oauy > obuy; - + // Return -1 if a is above b, 1 if b is above a, or 0 otherwise return (above || slightlyAboveBottom || slightlyAboveTop ? -1 : (below || slightlyBelowBottom || slightlyBelowTop ? 1 : 0)) }.bind(this)); - + // Return lanes return lanes; }, - + getNamespace: function() { if(!this.namespace) { var stencilsets = this.facade.getStencilSets(); @@ -24206,23 +24206,23 @@ new function(){ return this.namespace; } }; - + var ResizeLanesCommand = ORYX.Core.Command.extend({ construct: function(shape, parent, pool, plugin) { - + this.facade = plugin.facade; this.plugin = plugin; this.shape = shape; this.changes; - + this.pool = pool; - + this.parent = parent; - - + + this.shapeChildren = []; - + /* * The Bounds have to be stored * separate because they would @@ -24245,7 +24245,7 @@ new function(){ }.bind(this)); this.shapeUpperLeft = this.shape.bounds.upperLeft(); - + // If there is no parent, // correct the abs position with the parents abs. /*if (!this.shape.parent) { @@ -24256,16 +24256,16 @@ new function(){ this.parentHeight = this.parent.bounds.height(); }, - + getLeafLanes: function(lane){ var childLanes = this.plugin.getLanes(lane).map(function(child){ return this.getLeafLanes(child); }.bind(this)).flatten(); return childLanes.length > 0 ? childLanes : [lane]; }, - + findNewLane: function(){ - + var lanes = this.plugin.getLanes(this.parent); var leafLanes = this.getLeafLanes(this.parent); @@ -24275,11 +24275,11 @@ new function(){ return aupl < bupl ? -1 : (aupl > bupl ? 1 : 0) })*/ this.lane = leafLanes.find(function(l){ return l.bounds.upperLeft().y >= this.shapeUpperLeft.y }.bind(this)) || leafLanes.last(); - this.laneUpperLeft = this.lane.bounds.upperLeft(); + this.laneUpperLeft = this.lane.bounds.upperLeft(); }, - + execute: function() { - + if(this.changes) { this.executeAgain(); return; @@ -24290,87 +24290,87 @@ new function(){ * Shape into the lane that takes its * place */ - + if (!this.lane){ this.findNewLane(); } - - if(this.lane) { - + + if(this.lane) { + var laUpL = this.laneUpperLeft; var shUpL = this.shapeUpperLeft; - + var depthChange = this.plugin.getDepth(this.lane, this.parent)-1; - + this.changes = $H({}); - + // Selected lane is BELOW the removed lane - if (laUpL.y >= shUpL.y) { + if (laUpL.y >= shUpL.y) { this.lane.getChildShapes().each(function(childShape) { - + /* * Cache the changes for rollback */ if(!this.changes[childShape.getId()]) { this.changes[childShape.getId()] = this.computeChanges(childShape, this.lane, this.lane, this.shape.bounds.height()); } - + childShape.bounds.moveBy(0, this.shape.bounds.height()); }.bind(this)); - + this.plugin.hashChildShapes(this.lane); - + this.shapeChildren.each(function(shapeChild) { shapeChild.shape.bounds.set(shapeChild.bounds); shapeChild.shape.bounds.moveBy((shUpL.x-30)-(depthChange*30), 0); - + /* * Cache the changes for rollback */ if(!this.changes[shapeChild.shape.getId()]) { this.changes[shapeChild.shape.getId()] = this.computeChanges(shapeChild.shape, this.shape, this.lane, 0); } - + this.lane.add(shapeChild.shape); - - }.bind(this)); - + + }.bind(this)); + this.lane.bounds.moveBy(0, shUpL.y-laUpL.y); - - // Selected lane is ABOVE the removed lane + + // Selected lane is ABOVE the removed lane } else if(shUpL.y > laUpL.y){ - + this.shapeChildren.each(function(shapeChild) { - shapeChild.shape.bounds.set(shapeChild.bounds); - shapeChild.shape.bounds.moveBy((shUpL.x-30)-(depthChange*30), this.lane.bounds.height()); - + shapeChild.shape.bounds.set(shapeChild.bounds); + shapeChild.shape.bounds.moveBy((shUpL.x-30)-(depthChange*30), this.lane.bounds.height()); + /* * Cache the changes for rollback */ if(!this.changes[shapeChild.shape.getId()]) { this.changes[shapeChild.shape.getId()] = this.computeChanges(shapeChild.shape, this.shape, this.lane, 0); } - + this.lane.add(shapeChild.shape); - + }.bind(this)); } - - - + + + } - + /* * Adjust the height of the lanes */ // Get the height values - var oldHeight = this.lane.bounds.height(); + var oldHeight = this.lane.bounds.height(); var newHeight = this.lane.length === 1 ? this.parentHeight : this.lane.bounds.height() + this.shape.bounds.height(); // Set height this.setHeight(newHeight, oldHeight, this.parent, this.parentHeight, true); - + // Cache all sibling lanes //this.changes[this.shape.getId()] = this.computeChanges(this.shape, this.parent, this.parent, 0); this.plugin.getLanes(this.parent).each(function(childLane){ @@ -24378,61 +24378,61 @@ new function(){ this.changes[childLane.getId()] = this.computeChanges(childLane, this.parent, this.parent, 0); } }.bind(this)) - + // Update this.update(); }, - + setHeight: function(newHeight, oldHeight, parent, parentHeight, store){ - + // Set heigh of the lane this.plugin.setDimensions(this.lane, this.lane.bounds.width(), newHeight); this.plugin.hashedBounds[this.pool.id][this.lane.id] = this.lane.absoluteBounds(); - + // Adjust child lanes this.plugin.adjustHeight(this.plugin.getLanes(parent), this.lane); - + if (store === true){ // Store changes - this.changes[this.shape.getId()] = this.computeChanges(this.shape, parent, parent, 0, oldHeight, newHeight); + this.changes[this.shape.getId()] = this.computeChanges(this.shape, parent, parent, 0, oldHeight, newHeight); } - + // Set parents height this.plugin.setDimensions(parent, parent.bounds.width(), parentHeight); - + if (parent !== this.pool){ this.plugin.setDimensions(this.pool, this.pool.bounds.width(), this.pool.bounds.height() + (newHeight-oldHeight)); } }, - + update: function(){ - + // Hack to prevent the updating of the dockers this.plugin.hashedBounds[this.pool.id]["REMOVED"] = true; // Update //this.facade.getCanvas().update(); }, - + rollback: function() { - + var laUpL = this.laneUpperLeft; var shUpL = this.shapeUpperLeft; - + this.changes.each(function(pair) { - + var parent = pair.value.oldParent; var shape = pair.value.shape; var parentHeight = pair.value.parentHeight; var oldHeight = pair.value.oldHeight; var newHeight = pair.value.newHeight; - + // Move siblings if (shape.getStencil().id().endsWith("Lane")){ - shape.bounds.moveTo(pair.value.oldPosition); + shape.bounds.moveTo(pair.value.oldPosition); } - + // If lane - if(oldHeight) { + if(oldHeight) { this.setHeight(oldHeight, newHeight, parent, parent.bounds.height() + (oldHeight - newHeight)); if (laUpL.y >= shUpL.y) { this.lane.bounds.moveBy(0, this.shape.bounds.height()-1); @@ -24440,30 +24440,30 @@ new function(){ } else { parent.add(shape); shape.bounds.moveTo(pair.value.oldPosition); - + } - + }.bind(this)); - + // Update //this.update(); - + }, - + executeAgain: function() { - + this.changes.each(function(pair) { var parent = pair.value.newParent; var shape = pair.value.shape; var newHeight = pair.value.newHeight; var oldHeight = pair.value.oldHeight; - + // If lane if(newHeight) { var laUpL = this.laneUpperLeft.y; var shUpL = this.shapeUpperLeft.y; - + if (laUpL >= shUpL) { this.lane.bounds.moveBy(0, shUpL - laUpL); } @@ -24472,22 +24472,22 @@ new function(){ parent.add(shape); shape.bounds.moveTo(pair.value.newPosition); } - + }.bind(this)); - + // Update this.update(); }, - + computeChanges: function(shape, oldParent, parent, yOffset, oldHeight, newHeight) { - + oldParent = this.changes[shape.getId()] ? this.changes[shape.getId()].oldParent : oldParent; var oldPosition = this.changes[shape.getId()] ? this.changes[shape.getId()].oldPosition : shape.bounds.upperLeft(); - + var sUl = shape.bounds.upperLeft(); - + var pos = {x: sUl.x, y: sUl.y + yOffset}; - + var changes = { shape : shape, parentHeight: oldParent.bounds.height(), @@ -24498,13 +24498,13 @@ new function(){ newPosition : pos, newHeight : newHeight }; - + return changes; } - + }); - + ORYX.Plugins.BPMN2_0 = ORYX.Plugins.AbstractPlugin.extend(ORYX.Plugins.BPMN2_0); - -}() \ No newline at end of file + +}() \ No newline at end of file diff --git a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css index 7f36651..4e3da79 100644 --- a/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css +++ b/len-activiti/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css @@ -5499,7 +5499,7 @@ button.close { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; - top: 50%; + top: 0%; z-index: 5; display: inline-block; } diff --git a/len-activiti/src/main/resources/static/modeler.html b/len-activiti/src/main/resources/static/modeler.html index 9ae605c..a35a9d4 100644 --- a/len-activiti/src/main/resources/static/modeler.html +++ b/len-activiti/src/main/resources/static/modeler.html @@ -8,22 +8,22 @@ - - - Activiti Editor - - - + + + Activiti Editor + + + - - + + - - + + - + + + + + + \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/login/demo2.png b/len-sys/src/main/resources/plugin/login/demo2.png new file mode 100644 index 0000000000000000000000000000000000000000..675c74b3e0a682fbb07b281bc6331845a25be495 GIT binary patch literal 687033 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 z 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%0Aun3C+C72SH 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�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%0ARx3e#^u} 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


        gxSeue`TOqSxn1Fc! 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

        S7_5}NdP=(gJcakr_b`@Gl$zm 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

        ").appendTo(c)}else{console.log(a.join(""))}}};Fai.logAlert=function(){var b=Fai.Cookie.get("_fai_debug");if(b=="true"||Fai.openLog){var a=$.makeArray(arguments);alert(a.join(""))}};Fai.replaceContentOfURL=function(a){return(a.replace(/((https?|ftp|file):\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;]*)/g,'$1'))};Fai.getByteLength=function(f,g){var d=0,b,c,a;g=g?g.toLowerCase():"";if(g==="utf-16"||g==="utf16"){for(c=0,a=f.length;c"9"){return false}return true};Fai.isLetter=function(a){if((a<"a"||a>"z")&&(a<"A"||a>"Z")){return false}return true};Fai.isChinese=function(a){if(a<"一"||a>"龥"){return false}return true};Fai.isIp=function(c){if(typeof c!="string"||$.trim(c)==""){return false}var b=c.split(".");if(b.length!=4){return false}var a=true;$.each(b,function(d,f){if(!Fai.isNumber(f)||parseInt(f)<0||parseInt(f)>255){a=false;return true}});return a};Fai.isDomain=function(a){if(/^[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]$/.test(a)){if(a.indexOf("--")>=0){return false}return true}else{return false}};Fai.isWord=function(b){var a=/^[a-zA-Z0-9_]+$/;return a.test(b)};Fai.isEmail=function(a){var b=/^[a-zA-Z0-9]+([_=\&\-\.\+]*[a-zA-Z0-9]+)*@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)+$/;return b.test(a)};Fai.isEmailDomain=function(a){var b=/^[a-zA-Z0-9][a-zA-Z0-9_\-]*\.[a-zA-Z0-9\-][a-zA-Z0-9_\-\.]*[a-zA-Z0-9]$/;return b.test(a)};Fai.isMobile=function(a){var b=/^1[3456789]\d{9}$/;return b.test(a)};Fai.isPhone=function(a){var c=/^([^\d])+([^\d])*([^\d])$/;var b=/^([\d\+\s\(\)-])+([\d\+\s\(\)-])*([\d\+\s\(\)-])$/;if(c.test(a)){return false}return b.test(a)};Fai.isNationMobile=function(a){var b=/^\d{8,14}$/;return b.test(a)};Fai.isCardNo=function(a){var b=/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;return b.test(a)};Fai.isUrl=function(d,c){if(typeof c=="undefined"){c=true}if(c&&d.length>=1&&d.charAt(0)=="/"){return true}if(c&&d.length>=1&&d.charAt(0)=="#"){return true}var b=/^(\w+:).+/;var a=b.test(d);return a};Fai.fixUrl=function(a,b){if(Fai.isUrl(a,b)){return a}return"http://"+a};Fai.checkBit=function(i,b){var f=true;if(i>2147483647||i<0||b>2147483647||b<0){f=false}if(f){return(i&b)==b}var g=i.toString(2);var d=b.toString(2);if(g.length>62||d.length>62){alert("Does not support more than 62 bit. flagBinary.length="+g.length+",bitFlagBinary.length"+d.length+".");return false}var h=flagLow=bitFlagHight=bitFlagLow=0;if(g.length>31){var c=g.slice(0,g.length-31);var a=g.slice(g.length-31);h=parseInt(c,"2");flagLow=parseInt(a,"2")}else{flagLow=parseInt(g.slice(0,g.length),"2")}if(d.length>31){var c=d.slice(0,d.length-31);var a=d.slice(d.length-31);bitFlagHight=parseInt(c,"2");bitFlagLow=parseInt(a,"2")}else{bitFlagLow=parseInt(d.slice(0,d.length),"2")}var j=(flagLow&bitFlagLow)==bitFlagLow;if(j){j=(h&bitFlagHight)==bitFlagHight}return j};Fai.andBit=function(b,h){var a=true;if(b>2147483647||b<0||h>2147483647||h<0){a=false}if(a){return b&=h}var f=b.toString(2);var d=h.toString(2);if(f.length>62||d.length>62){alert("Does not support more than 62 bit. flagBinary.length="+f.length+",bitFlagBinary.length"+d.length+".");return 0}var c=flagLow=bitFlagHight=bitFlagLow=0;if(f.length>31){var g=f.slice(0,f.length-31);var i=f.slice(f.length-31);c=parseInt(g,"2");flagLow=parseInt(i,"2")}else{flagLow=parseInt(f.slice(0,f.length),"2")}if(d.length>31){var g=d.slice(0,d.length-31);var i=d.slice(d.length-31);bitFlagHight=parseInt(g,"2");bitFlagLow=parseInt(i,"2")}else{bitFlagLow=parseInt(d.slice(0,d.length),"2")}flagLow&=bitFlagLow;c&=bitFlagHight;f=flagLow.toString(2);for(;f.length<31;){f="0"+f}f=c.toString(2)+f;return parseInt(f,"2")};Fai.orBit=function(b,h){var a=true;if(b>2147483647||b<0||h>2147483647||h<0){a=false}if(a){return b|=h}var f=b.toString(2);var d=h.toString(2);if(f.length>62||d.length>62){alert("Does not support more than 62 bit. flagBinary.length="+f.length+",bitFlagBinary.length"+d.length+".");return 0}var c=flagLow=bitFlagHight=bitFlagLow=0;if(f.length>31){var g=f.slice(0,f.length-31);var i=f.slice(f.length-31);c=parseInt(g,"2");flagLow=parseInt(i,"2")}else{flagLow=parseInt(f.slice(0,f.length),"2")}if(d.length>31){var g=d.slice(0,d.length-31);var i=d.slice(d.length-31);bitFlagHight=parseInt(g,"2");bitFlagLow=parseInt(i,"2")}else{bitFlagLow=parseInt(d.slice(0,d.length),"2")}flagLow|=bitFlagLow;c|=bitFlagHight;f=flagLow.toString(2);for(;f.length<31;){f="0"+f}f=c.toString(2)+f;return parseInt(f,"2")};Fai.renderUEditor=function(b){var a={ueditorId:null,setPageChange:null,initContent:null,minFrameHeight:0,faiscoRichTip:null,withPage:null};$.extend(a,b);var c=new baidu.editor.ui.Editor({upLoadFlashUrl:"/ajax/upfile_h.jsp?type=50",upLoadImageUrl:"/ajax/upimg_h.jsp",ueditorChangeEvent:a.setPageChange,htmlModuleRichTip:a.faiscoRichTip,initialContent:a.initContent,minFrameHeight:a.minFrameHeight,toolbars:[["shrinkopenup","removeformat","|","bold","italic","underline","|","fontfamily","fontsize","forecolor","backcolor","|","insertorderedlist","insertunorderedlist","lineheight","justifyright","|","link","unlink","qqservice","image","flash","inserttable",a.withPage,"|","source","||","pasteplain","|","selectall","undo","redo","|","strikethrough","superscript","subscript","horizontal","|","indent","rowspacingtop","rowspacingbottom","|","deletetable","insertparagraphbeforetable","insertrow","deleterow","insertcol","deletecol","mergecells","mergeright","mergedown","splittocells","splittorows","splittocols","|","fullscreen"]]});c.render(a.ueditorId);return c};Fai.isEnterKey=function(a){if($.browser.msie){if(event.keyCode==13){return true}else{return false}}else{if(a.which==13){return true}else{return false}}};Fai.isNumberKey=function(b,a){if($.browser.msie){if(a&&event.keyCode==45){return true}if(((event.keyCode>47)&&(event.keyCode<58))||(event.keyCode==8)){return true}else{return false}}else{if(a&&b.which==45){return true}if(((b.which>47)&&(b.which<58))||(b.which==8)){return true}else{return false}}};Fai.isPhoneNumberKey=function(b,a){if($.browser.msie){if(a&&event.keyCode==45){return true}if(((event.keyCode>47)&&(event.keyCode<58))||(event.keyCode==8)||(event.keyCode==44)){return true}else{return false}}else{if(a&&b.which==45){return true}if(((b.which>47)&&(b.which<58))||(b.which==8)||(b.which==44)){return true}else{return false}}};Fai.checkTwoDecimal=function(c,f){var d=$("#"+f).val();var b=/^[0-9]\d*(?:\.\d{1,2}|\d*)$/;if($.browser.msie){if(event.keyCode>47&&event.keyCode<58){var a=String.fromCharCode(c.which);d=d+""+a;return b.test(d)}}else{if(c.which>47&&c.which<58){var a=String.fromCharCode(c.which);d=d+""+a;return b.test(d)}}};Fai.checkOneDecimal=function(c,f){var d=$("#"+f).val();var b=/^[0-9]\d*(?:\.\d{1}|\d*)$/;if($.browser.msie){if(event.keyCode>47&&event.keyCode<58){var a=String.fromCharCode(c.which);d=d+""+a;return b.test(d)}}else{if(c.which>47&&c.which<58){var a=String.fromCharCode(c.which);d=d+""+a;return b.test(d)}}};Fai.isNumberKey2=function(c,a,b){if(a){$(c).val($(c).val().replace(/[^0-9\-]/g,""))}else{$(c).val($(c).val().replace(/[^0-9]/g,""))}};Fai.isFloatKey=function(a){if($.browser.msie){if(((event.keyCode>47)&&(event.keyCode<58))||(event.keyCode==8)||(event.keyCode==46)){return true}else{return false}}else{if(((a.which>47)&&(a.which<58))||(a.which==8)||(a.which==46)){return true}else{return false}}};Fai.flashChecker=function(){var hasFlash=0;var flashVersion=0;var isIE= +/*@cc_on!@*/ +0;if(isIE){try{var swf=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(swf){hasFlash=1;VSwf=swf.GetVariable("$version");flashVersion=parseInt(VSwf.split(" ")[1].split(",")[0])}}catch(ex){}}else{if(navigator.plugins&&navigator.plugins.length>0){var swf=navigator.plugins["Shockwave Flash"];if(swf){hasFlash=1;var words=swf.description.split(" ");for(var i=0;i=0){return true}return false};Fai.isOpera=function(){return $.browser.opera||$.browser.opr?true:false};Fai.isAndroid=function(){return $.browser.android?true:false};Fai.isIpad=function(){return $.browser.ipad?true:false};Fai.isIphone=function(){return $.browser.iphone?true:false};Fai.BrowserType={UNKNOWN:0,SPIDER:1,CHROME:2,FIREFOX:3,MSIE8:4,MSIE7:5,MSIE6:6,MSIE9:7,SAFARI:8,MSIE10:9,MSIE11:10,OPERA:11,APPLE_WEBKIT:12};Fai.getBrowserType=function(){if(Fai.isIE6()){return Fai.BrowserType.MSIE6}else{if(Fai.isIE7()){return Fai.BrowserType.MSIE7}else{if(Fai.isIE8()){return Fai.BrowserType.MSIE8}else{if(Fai.isIE9()){return Fai.BrowserType.MSIE9}else{if(Fai.isIE10()){return Fai.BrowserType.MSIE10}else{if(Fai.isIE11()){return Fai.BrowserType.MSIE11}else{if(Fai.isMozilla()){return Fai.BrowserType.FIREFOX}else{if(Fai.isOpera()){return Fai.BrowserType.OPERA}else{if(Fai.isChrome()){return Fai.BrowserType.CHROME}else{if(Fai.isSafari()){return Fai.BrowserType.SAFARI}else{if(Fai.isAppleWebKit()){return Fai.BrowserType.APPLE_WEBKIT}else{return Fai.BrowserType.UNKNOWN}}}}}}}}}}}};Fai.Screen=function(){return{width:window.screen.width,height:window.screen.height}};Fai.ScreenType={OTHER:0,W1920H1080:1,W1680H1050:2,W1600H1200:3,W1600H1024:4,W1600H900:5,W1440H900:6,W1366H768:7,W1360H768:8,W1280H1024:9,W1280H960:10,W1280H800:11,W1280H768:12,W1280H720:13,W1280H600:14,W1152H864:15,W1024H768:16,W800H600:17};Fai.getScreenType=function(b,a){if(b==1920&&a==1080){return Fai.ScreenType.W1920H1080}else{if(b==1680&&a==1050){return Fai.ScreenType.W1680H1050}else{if(b==1600&&a==1200){return Fai.ScreenType.W1600H1200}else{if(b==1600&&a==1024){return Fai.ScreenType.W1600H1024}else{if(b==1600&&a==900){return Fai.ScreenType.W1600H900}else{if(b==1440&&a==900){return Fai.ScreenType.W1440H900}else{if(b==1366&&a==768){return Fai.ScreenType.W1366H768}else{if(b==1360&&a==768){return Fai.ScreenType.W1360H768}else{if(b==1280&&a==1024){return Fai.ScreenType.W1280H1024}else{if(b==1280&&a==960){return Fai.ScreenType.W1280H960}else{if(b==1280&&a==800){return Fai.ScreenType.W1280H800}else{if(b==1280&&a==768){return Fai.ScreenType.W1280H768}else{if(b==1280&&a==720){return Fai.ScreenType.W1280H720}else{if(b==1280&&a==600){return Fai.ScreenType.W1280H600}else{if(b==1152&&a==864){return Fai.ScreenType.W1152H864}else{if(b==1024&&a==768){return Fai.ScreenType.W1024H768}else{if(b==800&&a==600){return Fai.ScreenType.W800H600}else{return Fai.ScreenType.OTHER}}}}}}}}}}}}}}}}}};Fai.getCssInt=function(c,b){if(c.css(b)){var a=parseInt(c.css(b).replace("px",""));if(isNaN(a)){return 0}return a}else{return 0}};Fai.getEventX=function(a){a=a||window.event;return a.pageX||a.clientX+document.body.scrollLeft};Fai.getEventY=function(a){a=a||window.event;return a.pageY||a.clientY+document.body.scrollTop};Fai.inRect=function(a,b){if(a.x>b.left&&a.x<(b.left+b.width)&&a.y>b.top&&a.y<(b.top+b.height)){return true}return false};Fai.addUrlParams=function(a,b){if(Fai.isNull(b)){return a}if(a.indexOf("?")<0){return a+"?"+b}return a+"&"+b};Fai.setUrlParams=function(b,d){if(!d){return b}var h=/^([^\?#]*)(\?[^#]*)?(#.*)?/.exec(b);if(!h){console.error("解析url失败");return b}var j=h[1]||"",g=h[2]||"",i=h[3]||"";if(g){for(var f in d){var a="(\\?|&)"+f+"=[^&]*";var c=new RegExp(a,"g");g=g.replace(c,"")}}for(var f in d){if(d[f]){g+=("&"+f+"="+d[f])}}if(g){g=g.replace(/^&/,"?")}return j+g+i};Fai.addArrElementsNoRepeat=function(a,c){if(a.length>0){var b=0;$.each(a,function(d,f){if(a[d]==c){b++}});if(b==0){a[a.length]=c}}else{a[a.length]=c}return a};Fai.getUrlRoot=function(a){var b=a.indexOf("://");if(b<0){return a}b=a.indexOf("/",b+3);if(b<0){return"/"}return a.substring(b)};Fai.getUrlParam=function(b,a){var d=b.substring(b.indexOf("?")+1,b.length).split("&");var c;$.each(d,function(f,h){var g=decodeURIComponent(h.substring(0,h.indexOf("=")));if(g===a){c=decodeURIComponent(h.substring(h.indexOf("=")+1,h.length));return false}});return c};Fai.encodeHtml=function(a){return a&&a.replace?(a.replace(/&/g,"&").replace(/ /g," ").replace(/\b +/g," ").replace(//g,">").replace(/\\/g,"\").replace(/\'/g,"'").replace(/\"/g,""").replace(/\n/g,"
        ").replace(/\r/g,"")):a};Fai.decodeHtml=function(a){return a&&a.replace?(a.replace(/ /gi," ").replace(/</gi,"<").replace(/>/g,">").replace(/\/gi,"\\").replace(/'/gi,"'").replace(/"/gi,'"').replace(/\/gi,"\n").replace(/&/gi,"&")):a};Fai.encodeHtmlJs=function(a){return a&&a.replace?(a.replace(/\\/g,"\\\\").replace(/\'/g,"\\x27").replace(/\"/g,"\\x22").replace(/\n/g,"\\n").replace(//g,"\\x3e")):a};Fai.encodeHtmlAttr=function(a){return a&&a.replace?(a.replace(/\"/g,""").replace(/\'/g,"'").replace(//g,">").replace(/&/g,"&")).replace(/\\/g,"c;"):a};Fai.encodeUrl=function(a){return typeof a==="undefined"?"":encodeURIComponent(a)};Fai.decodeUrl=function(b){var a="";try{a=(typeof b==="undefined"?"":decodeURIComponent(b))}catch(c){a=""}return a};Fai.toUN={on:function(d){var b=[],c=0;for(;c=0){b=b.substring(d+1)}if(a){return b}else{var c=b.lastIndexOf(".");if(c>=0){return b.substring(0,c)}else{return b}}};Fai.format=function(){var c=arguments[0];for(var a=0;a0){g=Fai.format("您还未输入{0}",b)}else{if(f.lengthc){g=Fai.format("{0}不能多于{1}个字,请裁减后重试。",b,c)}}}Fai.showErr(a,g);return !g};Fai.showErr=function(a,c){var b=$("#"+a);if(c){b.show();b.text(c)}else{b.hide()}};Fai.showMsg=function(b){var a=$("#msg");if(b&&b.length>0){a.show();a.text(b)}else{a.hide();a.text("")}};Fai.checkVal=function(c,d,b,a){var f;if(d.lengtha){alert(Fai.format("{0}不能多于{1}个字符",c,a));f=false}else{f=true}}return f};Fai.getEl=function(a){return typeof(a)=="string"?document.getElementById(a):a};Fai.getBrowserWidth=function(){return document.documentElement.clientWidth};Fai.getBrowserHeight=function(){return document.documentElement.clientHeight};Fai.delNode=function(a){if(Fai.getEl(a)!=null){Fai.getEl(a).parentNode.removeChild(Fai.getEl(a))}};Fai.delChildNodes=function(b){if(b==null||b.childNodes==null){return}var c=b.childNodes.length;for(var a=0;ac){return}}};Fai.Msg={CONFIRM:0,SUCCEED:1,FAIL:2,TIP:3};Fai.Msg.box=function(a,b){Fai.delNode("msgBox");alert("ok")};Fai.Debug={};Fai.Debug.alert=function(c){if(typeof(c)!="object"){alert(c);return}var a="";for(var b in c){if(typeof(c[b])=="function"){a+=b+"=function\t"}else{a+=b+"="+c[b]+"\t"}}alert(a)};Fai.Debug.msg=function(c){if(Fai.isNull(Fai.Debug.cnt)){Fai.Debug.cnt=0}++Fai.Debug.cnt;var b="";b="
        ";if(Fai.top.$("#dbgMsg").length==0){Fai.top.$(b).appendTo("body")}var a="";a+='
        '+Fai.Debug.cnt+":"+c+"
        ";Fai.top.$("#dbgMsg").find(".tips").remove();Fai.top.$(a).appendTo("#dbgMsg")};Fai.Debug.track=function(d){if(Fai.isNull(Fai.Debug.outtrack)||!Fai.Debug.outtrack){return}var a=(new Date()).getTime();if(Fai.isNull(Fai.Debug.last)){Fai.Debug.last=a}var c=(a-Fai.Debug.last);Fai.Debug.last=a;if(d==""||c<=0){return}var b="";b="
        ";var f=Fai.top.$("#dbgMsg");if(f.length==0){f=Fai.top.$(b);f.appendTo("body")}Fai.top.$("
        "+d+" : "+c+"
        ").appendTo(f)};Fai.Cookie={};Fai.Cookie.set=function(c,f){var a=arguments;var i=arguments.length;var b=(i>2)?a[2]:null;var h=(i>3)?a[3]:"/";var d=(i>4)?a[4]:null;var g=(i>5)?a[5]:false;document.cookie=c+"="+escape(f)+((b==null)?"":("; expires="+b.toGMTString()))+((h==null)?"":("; path="+h))+((d==null)?"":("; domain="+d))+((g==true)?"; secure":"")};Fai.Cookie.get=function(d){var b=d+"=";var g=b.length;var a=document.cookie.length;var f=0;var c=0;while(f=a.left&&b.x<=a.left+a.width&&b.y>=a.top&&b.y<=a.top+a.height){return true}return false};Fai.Img={};Fai.Img={MODE_SCALE_FILL:1,MODE_SCALE_WIDTH:2,MODE_SCALE_HEIGHT:3,MODE_SCALE_DEFLATE_WIDTH:4,MODE_SCALE_DEFLATE_HEIGHT:5,MODE_SCALE_DEFLATE_FILL:6,MODE_SCALE_DEFLATE_MAX:7};Fai.Img.optimize=function(d,g){var b=new Image();b.src=d.src;var c=b.width;var a=b.height;if(Fai.isNull(c)||c==0||Fai.isNull(a)||a==0){c=d.width;a=d.height}var f=Fai.Img.calcSize(c,a,g.width,g.height,g.mode);d.width=f.width;d.height=f.height;if(g.display==1){d.style.display="inline"}else{if(g.display==2){d.style.display="none"}else{if(g.display==3){d.style.display="inline-block"}else{d.style.display="block"}}}return{width:d.width,height:d.height}};Fai.Img.calcSize=function(f,a,h,g,i){var c={width:f,height:a};if(i==Fai.Img.MODE_SCALE_FILL){var d=f/h;var b=a/g;if(d>b){c.width=h;c.height=a/d}else{c.width=f/b;c.height=g}}else{if(i==Fai.Img.MODE_SCALE_WIDTH){var d=f/h;c.width=h;c.height=a/d}else{if(i==Fai.Img.MODE_SCALE_HEIGHT){var b=a/g;c.width=f/b;c.height=g}else{if(i==Fai.Img.MODE_SCALE_DEFLATE_WIDTH){var d=f/h;if(d>1){c.width=h;c.height=a/d}}else{if(i==Fai.Img.MODE_SCALE_DEFLATE_HEIGHT){var b=a/g;if(b>1){c.width=f/b;c.height=g}}else{if(i==Fai.Img.MODE_SCALE_DEFLATE_FILL){var d=f/h;var b=a/g;if(d>b){if(d>1){c.width=h;c.height=a/d}}else{if(b>1){c.width=f/b;c.height=g}}}else{if(i==Fai.Img.MODE_SCALE_DEFLATE_MAX){if(f>h&&a>g){var d=f/h;var b=a/g;if(d";if(Fai.top.$("#ing").length==0){Fai.top.$(i).appendTo("body")}var f=Fai.top.$("#ing");var g=Fai.top.$(document).scrollTop();if(Fai.isIE()&&g==0){g=Fai.top.$("html").scrollTop()}if(g>0){f.css("top",((g)+50)+"px")}var d=Fai.top.$("html").find("#mainFrame")[0];if(d){f.css("top","200px")}var m=parseInt(Math.random()*10000);var a="";if(typeof k==="number"&&typeof s==="number"){a+='
        '+c+"
        '}else{a+='
        '+c+"
        '}f.find(".tips").remove();Fai.top.$(a).appendTo(f);var o=Fai.top.$(f).width();Fai.top.$(f).css("left",(Fai.top.document.documentElement.clientWidth-o)/2);if(l){Fai.top.Fai.removeIng(l,m,b)}var p=Fai.isIE6()||Fai.isIE7()||Fai.isIE8();if(p){Fai.top.$("#ing").animate({opacity:1,filter:"alpha(opacity=100)"},300)}else{Fai.top.$("#ing").css({opacity:1})}Fai.top.$("#ing").find(".close").bind("mouseenter",function(){$(this).addClass("close_hover")}).bind("mouseleave",function(){$(this).removeClass("close_hover")})};Fai.ing2=function(o,n,l,g,j){var f=(o==null||o=="")?"正在处理...":o;var d=Fai.top.document.body.clientWidth;var a=Fai.top.document.body.clientHeight;var k="";var h=" margin:180px auto; width:"+g+"px; height:"+j+"px; z-index:9999;position: absolute;";var p="transition: opacity ease .6s; -moz-transition: opacity ease .6s; -webkit-transition: opacity ease .6s; -o-transition: opacity ease .6s; opacity: 0; -webkit-opacity: 0; -moz-opacity: 0; -khtml-opacity: 0; filter:alpha(opacity=0);";k="
        ";if(Fai.top.$("#ing2").length==0){Fai.top.$(k).appendTo("body")}var b=Fai.top.$("#ing2");var r=Fai.top.$("body").scrollTop();if(Fai.isIE()&&r==0){r=Fai.top.$("html").scrollTop()}if(r>0){b.css("top",(r)+50+"px")}else{b.css("top",(r)+180+"px")}var c=parseInt(Math.random()*10000);var m="";if(typeof g==="number"&&typeof j==="number"){m+='
        '+f+"
        '}else{m+='
        '+f+"
        '}b.find(".tips2").remove();Fai.top.$(m).appendTo(b);var i=Fai.top.$(b).width();Fai.top.$(b).css("left",(Fai.top.document.documentElement.clientWidth-i)/2);if(n){Fai.top.Fai.removeIng(n,c,l)}var q=Fai.isIE6()||Fai.isIE7()||Fai.isIE8();if(q){Fai.top.$("#ing2").animate({opacity:1,filter:"alpha(opacity=100)"},300)}else{Fai.top.$("#ing2").css({opacity:1})}Fai.top.$("#ing2").find(".close").bind("mouseenter",function(){$(this).addClass("close_hover")}).bind("mouseleave",function(){$(this).removeClass("close_hover")})};Fai.removeAllIng=function(){Fai.top.$("#ing").remove()};Fai.removeIng=function(a,c,b){if(a){if(typeof c!="undefined"&&Fai.top.$("#"+c).length>0){Fai.top.window.setTimeout(function(){$("#"+c).fadeOut(1000)},(b?b:3000));Fai.top.window.setTimeout(function(){$("#"+c).remove()},(b?b+1500:4500))}else{Fai.top.$(".tips").fadeOut(1000);Fai.top.window.setTimeout(function(){$("#ing").remove()},(b?b:3000))}}else{if(typeof c!="undefined"&&Fai.top.$("#"+c).length>0){Fai.top.$("#"+c).fadeOut(500);Fai.top.window.setTimeout(function(){$("#"+c).remove()},1000)}else{Fai.top.$(".tips").fadeOut(500);Fai.top.window.setTimeout(function(){$("#ing").remove()},1000)}}Fai.top.$("#ing").css("opacity",0)};Fai.removeIng2=function(a,c,b){if(a){if(typeof c!="undefined"&&Fai.top.$("#"+c).length>0){Fai.top.window.setTimeout(function(){$("#"+c).fadeOut(1000)},(b?b:3000));Fai.top.window.setTimeout(function(){$("#"+c).remove()},(b?b+1500:4500))}else{Fai.top.$(".tips").fadeOut(1000);Fai.top.window.setTimeout(function(){$("#ing2").remove()},(b?b:3000))}}else{if(typeof c!="undefined"&&Fai.top.$("#"+c).length>0){Fai.top.$("#"+c).fadeOut(500);Fai.top.window.setTimeout(function(){$("#"+c).remove()},1000)}else{Fai.top.$(".tips").fadeOut(500);Fai.top.window.setTimeout(function(){$("#ing2").remove()},1000)}}Fai.top.$("#ing2").css("opacity",0)};Fai.bg=function(f,b){var c="";var a="";if(b){a="filter: alpha(opacity="+b*100+"); opacity:"+b+";"}if(Fai.isIE6()){var d=Fai.top.$("html").scrollTop();Fai.top.$("html").data("scrollTop",d);Fai.top.$("html").scrollTop(0);var d=Fai.top.$("body").scrollTop();Fai.top.$("body").data("scrollTop",d);Fai.top.$("body").scrollTop(0);Fai.top.$("html").data("overflow-x",Fai.top.$("html").css("overflow-x"));Fai.top.$("html").data("overflow-y",Fai.top.$("html").css("overflow-y"));Fai.top.$("html").css("overflow-x","hidden");Fai.top.$("html").css("overflow-y","hidden");Fai.top.$("body").data("overflow-x",Fai.top.$("body").css("overflow-x"));Fai.top.$("body").data("overflow-y",Fai.top.$("body").css("overflow-y"));Fai.top.$("body").css("overflow-x","hidden");Fai.top.$("body").css("overflow-y","hidden")}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){if(Fai.top.$("html").css("filter")){Fai.top.$("html").data("filter",Fai.top.$("html").css("filter"));Fai.top.$("html").css("filter","none")}}c='
        "+($.browser.msie&&$.browser.version==6?'':"")+"
        ";Fai.top.$(c).appendTo("body");Fai.stopInterval(null)};Fai.bodyBg=function(f,b){var c="";var a="";if(b){a="filter: alpha(opacity="+b*100+"); opacity:"+b+";"}if(Fai.isIE6()){var d=Fai.top.$("html").scrollTop();Fai.top.$("html").data("scrollTop",d);Fai.top.$("html").scrollTop(0);var d=Fai.top.$("body").scrollTop();Fai.top.$("body").data("scrollTop",d);Fai.top.$("body").scrollTop(0);Fai.top.$("html").data("overflow-x",Fai.top.$("html").css("overflow-x"));Fai.top.$("html").data("overflow-y",Fai.top.$("html").css("overflow-y"));Fai.top.$("html").css("overflow-x","hidden");Fai.top.$("html").css("overflow-y","hidden");Fai.top.$("body").data("overflow-x",Fai.top.$("body").css("overflow-x"));Fai.top.$("body").data("overflow-y",Fai.top.$("body").css("overflow-y"));Fai.top.$("body").css("overflow-x","hidden");Fai.top.$("body").css("overflow-y","hidden")}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){if(Fai.top.$("html").css("filter")){Fai.top.$("html").data("filter",Fai.top.$("html").css("filter"));Fai.top.$("html").css("filter","none")}}c='
        "+($.browser.msie&&$.browser.version==6?'':"")+"
        ";$(c).appendTo("body");Fai.stopInterval(null)};Fai.removeBodyBg=function(a){if(a){$("#popupBg"+a).remove()}else{$(".popupBg").remove()}if(Fai.isIE6()){Fai.top.$("html").css("overflow-x",Fai.top.$("html").data("overflow-x"));Fai.top.$("html").css("overflow-y",Fai.top.$("html").data("overflow-y"));Fai.top.$("body").css("overflow-x",Fai.top.$("body").data("overflow-x"));Fai.top.$("body").css("overflow-y",Fai.top.$("body").data("overflow-y"));Fai.top.$("html").scrollTop(Fai.top.$("html").data("scrollTop"));Fai.top.$("body").scrollTop(Fai.top.$("body").data("scrollTop"))}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){if(Fai.top.$("html").data("filter")){Fai.top.$("html").css("filter",Fai.top.$("html").data("filter"))}}Fai.startInterval(null)};Fai.removeBg=function(a){if(a){Fai.top.$("#popupBg"+a).remove()}else{Fai.top.$(".popupBg").remove()}if(Fai.isIE6()){Fai.top.$("html").css("overflow-x",Fai.top.$("html").data("overflow-x"));Fai.top.$("html").css("overflow-y",Fai.top.$("html").data("overflow-y"));Fai.top.$("body").css("overflow-x",Fai.top.$("body").data("overflow-x"));Fai.top.$("body").css("overflow-y",Fai.top.$("body").data("overflow-y"));Fai.top.$("html").scrollTop(Fai.top.$("html").data("scrollTop"));Fai.top.$("body").scrollTop(Fai.top.$("body").data("scrollTop"))}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){if(Fai.top.$("html").data("filter")){Fai.top.$("html").css("filter",Fai.top.$("html").data("filter"))}}Fai.startInterval(null)};Fai.removeBg=function(a){if(a){Fai.top.$("#popupBg"+a).remove()}else{Fai.top.$(".popupBg").remove()}if(Fai.isIE6()){Fai.top.$("html").css("overflow-x",Fai.top.$("html").data("overflow-x"));Fai.top.$("html").css("overflow-y",Fai.top.$("html").data("overflow-y"));Fai.top.$("body").css("overflow-x",Fai.top.$("body").data("overflow-x"));Fai.top.$("body").css("overflow-y",Fai.top.$("body").data("overflow-y"));Fai.top.$("html").scrollTop(Fai.top.$("html").data("scrollTop"));Fai.top.$("body").scrollTop(Fai.top.$("body").data("scrollTop"))}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){if(Fai.top.$("html").data("filter")){Fai.top.$("html").css("filter",Fai.top.$("html").data("filter"))}}Fai.startInterval(null)};Fai.bodyBg=function(h,d,c){var g="",a="",f=c||{},b=f.extClass||"";if(d){a="filter: alpha(opacity="+d*100+"); opacity:"+d+";"}if(Fai.isIE6()){$("body").data("height",$("body").css("height"));$("body").css("height","100%")}g='
        "+($.browser.msie&&$.browser.version==6?'':"")+"
        ";$(g).appendTo("body")};Fai.removeBodyBg=function(a){if(Fai.isIE6()){$("body").css("height",$("body").data("height"))}if(a){$("#popupBg"+a).remove()}else{$(".popupBg").remove()}};Fai.popupWindow=function(g){var x={title:"",width:500,height:300,frameSrcUrl:"about:_blank",frameScrolling:"auto",bannerDisplay:true,framePadding:true,opacity:"0.3",displayBg:true,bgClose:false,closeBtnClass:"",waitingPHide:true};x=$.extend(x,g);var t=parseInt(x.width),w=parseInt(x.height);var h=Fai.top.document.documentElement.clientWidth;if(!$.browser.msie){h=Fai.top.document.body.clientWidth}var n=Fai.top.document.documentElement.clientHeight;var j=(h-t)/2;if(x.leftMar!=null){j=parseInt(x.leftMar)}var E=80;if(!x.bannerDisplay){E=0}var r=(n-w-E)/2;if(x.topMar!=null){r=parseInt(x.topMar)}var y="",C="",i="";if(!x.bannerDisplay){C="display:none;";y="background:none;";if(!x.closeBtnClass){x.closeBtnClass="formX_old"}}if(!x.framePadding){y+="padding:0;";i='allowtransparency="true"'}var s=parseInt(Math.random()*10000),f="",u=true;if(x.divId!=null){u=false;f=$(x.divId).html()}if(x.divContent!=null){u=false;f=x.divContent}if(x.displayBg){Fai.bg(s,x.opacity)}var q="";var d=Fai.top.$("body").scrollTop();if(d==0){d=Fai.top.$("html").scrollTop()}var v="left:"+j+"px; top:"+(r+d)+"px;";if(Fai.isIE6()||Fai.isIE7()){v+="width:"+t+"px;"}var c="position:relative;width:"+t+"px;height:"+w+"px;",a="";if($.browser.msie){a=''}var q=['
        ',a,'
        '+x.title+"
        ",'
        ",'
        ",'
        ','
        ',f,"
        ","","","
        ","
        ",'
        ',"
        ","
        ",'","
        "];var p=Fai.top.$(q.join("")).appendTo("body");if(Fai.isIE6()||Fai.isIE7()){var b=p.find(".formBL");var o=Fai.getCssInt(b,"padding-left")+Fai.getCssInt(b,"padding-right")+Fai.getCssInt(b,"border-left-width")+Fai.getCssInt(b,"border-right-width");var D=p.find(".formBR");var A=Fai.getCssInt(D,"padding-left")+Fai.getCssInt(D,"padding-right")+Fai.getCssInt(D,"border-left-width")+Fai.getCssInt(D,"border-right-width");var l=p.find(".formBC");var z=Fai.getCssInt(l,"padding-left")+Fai.getCssInt(l,"padding-right")+Fai.getCssInt(l,"border-left-width")+Fai.getCssInt(l,"border-right-width");p.css("width",(t+o+A+z)+"px")}var B=40;var k=20;if(!x.bannerDisplay){B=0}if(p.height()+B>(n-k)){var m=p.height()+B-p.find(".formMSG").height();p.find(".formMSG").css("height",(n-k-m)+"px");p.css("top",(10+d)+"px")}if(u){Fai.top.$("#waitingP"+s).height(Fai.top.$("#formBC"+s).height()).width(Fai.top.$("#formBC"+s).width())}else{if(x.waitingPHide){Fai.top.$("#waitingP"+s).hide()}}if(x.divInit!=null){x.divInit(s)}Fai.top.$("#popupWindow"+s).ready(function(){if(u){var F="popupID="+s;Fai.top.$("#popupWindowIframe"+s).attr("src",Fai.addUrlParams(x.frameSrcUrl,F)).load(function(){if(x.waitingPHide){Fai.top.$("#waitingP"+s).hide()}})}p.draggable({start:function(){Fai.top.$("body").disableSelection();Fai.top.$("#colorpanel").remove();Fai.top.$(".faiColorPicker").remove()},handle:".formTL",stop:function(){Fai.top.$("body").enableSelection()}});p.find(".formX").bind("click",function(){if(Fai.isNull(g.msg)){Fai.closePopupWindow(s)}else{Fai.closePopupWindow(s,undefined,g.msg)}return false});p.find(".formTL").disableSelection();if(x.bgClose){Fai.top.$("#popupBg"+s).bind("click",function(){if(Fai.isNull(g.msg)){Fai.closePopupWindow(s)}else{Fai.closePopupWindow(s,undefined,g.msg)}return false})}});if(Fai.isNull(Fai.top._popupOptions)){Fai.top._popupOptions={}}if(Fai.isNull(Fai.top._popupOptions["popup"+s])){Fai.top._popupOptions["popup"+s]={}}if(!Fai.isNull(g.callArgs)){Fai.top._popupOptions["popup"+s].callArgs=g.callArgs}Fai.top._popupOptions["popup"+s].options=g;Fai.top._popupOptions["popup"+s].change=false;return s};Fai.setPopupWindowChange=function(b,a){if(Fai.isNull(Fai.top._popupOptions)){return}if(Fai.isNull(Fai.top._popupOptions["popup"+b])){return}Fai.top._popupOptions["popup"+b].change=a};Fai.closePopupWindow=function(h,d,g){if(h){try{if(Fai.isNull(Fai.top._popupOptions["popup"+h])){return}var c=Fai.top._popupOptions["popup"+h];if(c.change){if(typeof(g)=="undefined"){if(!window.confirm("您的修改尚未保存,确定要离开吗?")){return}}else{if(!window.confirm(g)){return}}}if(c.refresh){Fai.top.location.reload();return}Fai.top.Fai.removeAllIng(false);var b=c.options;if(!Fai.isNull(b.closeFunc)){if(d){b.closeFunc(d)}else{b.closeFunc(Fai.top._popupOptions["popup"+h].closeArgs)}}Fai.top._popupOptions["popup"+h]={};var a=Fai.top.$("#popupWindow"+h);if(b.animate){Fai.top.Fai.closePopupWindowAnimate(a,b.animateTarget,b.animateOnClose)}Fai.top.setTimeout("Fai.closePopupWindow_Internal('"+h+"')")}catch(f){}}else{Fai.removeBg();Fai.top.$(".formDialog").remove()}};Fai.closePopupWindow_Internal=function(c){if(typeof c=="undefined"){if($.browser.msie&&$.browser.version==10){var a=Fai.top.$(".formDialog").find(".popupWindowIframe")[0];if(a){popupWindowIframeWindow=a.contentWindow;if(popupWindowIframeWindow){try{if(popupWindowIframeWindow.swfObj){popupWindowIframeWindow.swfObj.destroy()}if(popupWindowIframeWindow.editor){if(popupWindowIframeWindow.editor.swfObj){popupWindowIframeWindow.editor.swfObj.destroy()}}}catch(b){}}}}Fai.top.$(".popupBg").remove();Fai.top.$(".formDialog").remove()}else{if($.browser.msie&&$.browser.version==10){var a=Fai.top.document.getElementById("popupWindowIframe"+c);if(a){popupWindowIframeWindow=a.contentWindow;if(popupWindowIframeWindow){try{if(popupWindowIframeWindow.swfObj){popupWindowIframeWindow.swfObj.destroy()}if(popupWindowIframeWindow.editor){if(popupWindowIframeWindow.editor.swfObj){popupWindowIframeWindow.editor.swfObj.destroy()}}}catch(b){}}}}Fai.top.Fai.removeBg(c);Fai.top.$("#popupWindowIframe"+c).remove();Fai.top.$("#popupWindow"+c).remove()}};Fai.closePopupWindowAnimate=function(b,f,d){var c=$("
        ");Fai.top.$("body").append(c);c.css({border:"1px solid #ff4400",position:"absolute","z-index":"9999",top:b.offset().top,left:b.offset().left,height:b.height()+"px",width:b.width()+"px"});var a=Fai.top.$("body").find(f);c.animate({top:a.offset().top+"px",left:a.offset().left+"px",width:a.width()+"px",height:a.height()+"px"},"slow",function(){if(typeof d=="function"){d()}c.remove()})};Fai.addPopupWindowBtn=function(h,b){var f=Fai.top.$("#popupWindow"+h);f.find(".formBtns").show();var g="popup"+h+b.id;var d=f.find(".formBtns td");var c=d.find("#"+g);if(c.length>0){c.remove()}if(b.click!="help"){if(typeof b.extClass!="undefined"){var a=b.extClass;Fai.top.$("").appendTo(d)}else{Fai.top.$("").appendTo(d)}}c=d.find("#"+g);if(typeof c.faiButton=="function"){c.faiButton()}if(b.callback&&Object.prototype.toString.call(b.callback)==="[object Function]"){c.click(function(){b.callback();if(Fai.isNull(b.msg)){Fai.top.Fai.closePopupWindow(h)}else{Fai.top.Fai.closePopupWindow(h,undefined,b.msg)}})}if(b.click=="close"){c.click(function(){if(Fai.isNull(b.msg)){Fai.top.Fai.closePopupWindow(h)}else{Fai.top.Fai.closePopupWindow(h,undefined,b.msg)}})}else{if(b.click=="help"){if(f.find("a.formH").length==0){f.append("")}}else{c.click(b.click)}}if(b.disable){c.attr("disabled",true);c.faiButton("disable")}$(document).keydown(function(j){if(j.keyCode==13){var i=f.find("#popup"+h+"save"),k;if(i.length>0&&!i.prop("disabled")){var k=$(":focus");if(k.is("input[type='text']")||k.is("textarea")){return}i.trigger("click")}}})};Fai.enablePopupWindowBtn=function(f,d,a){var c=Fai.top.$("#popupWindow"+f);d="popup"+f+d;var b=c.find("#"+d);if(a){b.removeAttr("disabled");b.faiButton("enable")}else{b.attr("disabled",true);b.faiButton("disable")}};Fai.popupBodyWindow=function(d){var s={title:"",width:500,height:300,bannerDisplay:true,opacity:"0.3",displayBg:true,window_extClass:"",bg_extClass:""};s=$.extend(s,d);var o=parseInt(s.width);var r=parseInt(s.height);var c=$("body").scrollTop();if(c==0){c=$("html").scrollTop()}var f=document.documentElement.clientWidth;if(!$.browser.msie){f=document.body.clientWidth}var i=document.documentElement.clientHeight;var w="";var t="";if(!s.bannerDisplay){w="display:none;";t="background:none;"}var g=20;if(s.leftMar!=null){g=s.leftMar}else{g=(f-o)/2}var m=20;if(s.topMar!=null){m=s.topMar}else{m=(i-r-80)/2}var q="";if(s.content!=null){q=s.content}var n=parseInt(Math.random()*10000);if(s.displayBg){Fai.bodyBg(n,s.opacity,{extClass:s.bg_extClass})}var p="left:"+g+"px; top:"+(m+c)+"px;";if(Fai.isIE6()||Fai.isIE7()){p+="width:"+o+"px;"}var b="position:relative;width:"+o+"px;height:"+r+"px;";var l=['
        ','
        ",'
        ','
        '+s.title+"
        ","
        ","
        ",'
        ",'
        ",'
        ','
        ',q,"
        ","","","
        ","
        ","
        ","
        ","","
        "];$(l.join("")).appendTo("body");var k=$("#popupWindow"+n);if(Fai.isIE6()||Fai.isIE7()){var a=k.find(".formBL");var j=Fai.getCssInt(a,"padding-left")+Fai.getCssInt(a,"padding-right")+Fai.getCssInt(a,"border-left-width")+Fai.getCssInt(a,"border-right-width");var y=k.find(".formBR");var v=Fai.getCssInt(y,"padding-left")+Fai.getCssInt(y,"padding-right")+Fai.getCssInt(y,"border-left-width")+Fai.getCssInt(y,"border-right-width");var h=k.find(".formBC");var u=Fai.getCssInt(h,"padding-left")+Fai.getCssInt(h,"padding-right")+Fai.getCssInt(h,"border-left-width")+Fai.getCssInt(h,"border-right-width");var x=k.find(".formMSG");var z=Fai.getCssInt(x,"margin-left")+Fai.getCssInt(x,"margin-right")+Fai.getCssInt(x,"border-left-width")+Fai.getCssInt(x,"border-right-width");k.css("width",(o+j+v+u+z)+"px")}k.ready(function(){$(".formDialog").draggable({handle:".formTL"});$(".formTL").disableSelection();$(".formX").click(function(){if(s.beforeClose){s.beforeClose()}Fai.closePopupBodyWindow(n);Fai.top.$("#popupBgTitle"+n).remove()})});k.data("settings",s);return n};Fai.closePopupBodyWindow=function(c){if(c){Fai.removeBodyBg(c);var a=$("#popupWindow"+c);var b=a.data("settings");if(b&&typeof b.closeFunc=="function"){b.closeFunc()}a.remove();$("body").focus()}else{Fai.removeBodyBg();$(".formDialog").remove()}};Fai.addPopupBodyWindowBtn=function(i,c){var g=$("#popupWindow"+i);g.find(".formBtns").show();var h="popup"+i+c.id;var f=g.find(".formBtns td");var d=f.find("#"+h);if(d.length>0){d.remove()}if(g.find(".popupButtons").length!=1){$("").appendTo(f)}if(g.find(".popupCheckboxs").length===1){$(g.find(".popupButtons")[0]).css("margin-right","10px").css("float","right").css("margin-top","-3px");if(Fai.isIE6()){$(g.find(".popupButtons")[0]).css("margin-top","-20px")}}var a="";if(typeof c.extClass!="undefined"){var b=" "+c.extClass;a=""}else{a=""}$(a).appendTo($(f).find(".popupButtons"));d=f.find("#"+h);if(typeof d.faiButton=="function"){d.faiButton()}if(c.click=="close"){d.click(function(){Fai.closePopupBodyWindow(i)})}else{d.click(c.click)}if(c.disable){d.attr("disabled",true);d.faiButton("disable")}};Fai.addPopupBodyWindowCheckBox=function(h,b){var f=$("#popupWindow"+h);f.find(".formBtns").show();var g="popup"+h+b.id;var d=f.find(".formBtns td");var c=d.find("#"+g);if(c.length>0){c.remove()}var a="";if(f.find(".popupCheckboxs").length!=1){d.removeAttr("align").css("line-height","22px");$(d.find(".popupButtons")[0]).css("margin-right","10px").css("float","right");$(""+a+"").appendTo(d)}else{$(a).appendTo($(f.find(".popupCheckboxs")[0]))}if(b.init==="checked"){$("#"+g).attr("checked","checked")}c=d.find("#"+g);c.click(b.click);if(b.disable){c.attr("disabled",true)}};Fai.enablePopupBodyWindowBtn=function(f,d,a){var c=$("#popupWindow"+f);d="popup"+f+d;var b=c.find("#"+d);if(a){b.removeAttr("disabled");b.faiButton("enable")}else{b.attr("disabled",true);b.faiButton("disable")}};Fai.successHandle=function(f,b,g,h,d,i){Fai.top.$("#ing").find(".tips").remove();var a=jQuery.parseJSON(f);var c="";if(a.success){if(a.msg){c=a.msg}if(b!=""){c=b}if(c&&c!=""){if(i==0){Fai.top.Fai.removeIng(true);alert(c)}else{if(i==1){Fai.ing(c,true)}else{if(i==2){Fai.ing(c,false)}else{if(i==3){}else{Fai.top.Fai.removeIng(true);alert(c)}}}}}if(h!=""){if(d==1){h=h.replace(/#.*/,"");if(Fai.top.location.href==h){Fai.top.location.reload()}else{Fai.top.location.href=h}}else{if(d==2){h=h.replace(/#.*/,"");if(parent.location.href==h){parent.location.reload()}else{parent.location.href=h}}else{if(d==3){return a.success}else{if(d==4){Fai.fkEval(h)}else{if(d==5){if(Fai.top.location.href==h){Fai.top.location.reload()}else{Fai.top.location.href=h}}else{h=h.replace(/#.*/,"");if(document.location.href==h){document.location.reload()}else{document.location.href=h}}}}}}}}else{if(a.msg){c=a.msg}if(c==""){c=g}if(c==""){c="系统错误"}if(i==0){alert(c)}else{if(i==1||i==2){Fai.ing(c,false)}else{alert(c)}}}return a.success};Fai.checkEmbed=function(a,c){if(Fai.top.location.href==document.location.href){var b=document.location.href;b=b.replace(/http:\/\/[^\/]+/,"");Fai.top.location.href=Fai.addUrlParams(a,"url="+Fai.encodeUrl(b)+"&item="+Fai.encodeUrl(c))}};Fai.disable=function(b,a){if(a){$("#"+b).attr("disabled",true)}else{$("#"+b).removeAttr("disabled")}};var timeout=500;var closetimer=0;var ddmenuitem=0;Fai.dropdownForm_open=function(){Fai.dropdownForm_canceltimer();Fai.dropdownForm_close();ddmenuitem=$(this).find("ul").eq(0).css("visibility","visible")};Fai.dropdownForm_close=function(){if(ddmenuitem){ddmenuitem.css("visibility","hidden")}};Fai.dropdownForm_timer=function(){closetimer=window.setTimeout(Fai.dropdownForm_close,timeout)};Fai.dropdownForm_canceltimer=function(){if(closetimer){window.clearTimeout(closetimer);closetimer=null}};$(function(){try{$(".dropdownForm > div").bind("click",Fai.dropdownForm_open);$(".dropdownForm > div").bind("mouseover",Fai.dropdownForm_open);$(".dropdownForm > div").bind("mouseout",Fai.dropdownForm_timer);Number.prototype.toFixed=function(f){var c=(parseInt(Math.round(this*Math.pow(10,f)+Math.pow(10,-(f+2))))/Math.pow(10,f)).toString();var b=c.indexOf(".");if(b<0&&f>0){c=c+".";for(var d=0;d=b){return false}}}});if(a>=b){setTimeout("Fai.doDelayLoadImg("+b+")",200)}};Fai.editableDiv=function(b){var f=$("#"+b);var d=f.width();var a=f.text();var c=$("");f.html(c);c.click(function(){return false});c.css("font-size","12px");c.css("text-align","left");c.width(d-10);c.trigger("focus").trigger("select");c.focus();c.blur(function(){var g=$(this);var h=g.val();if(h==""){f.html("默认栏目名称")}else{f.html(""+h+"")}if(h!=a){$("#saveButton").attr("disabled",false)}});c.keyup(function(i){var k=i||window.event;var g=k.keyCode;var h=$(this);switch(g){case 13:var j=h.val();if(j==""){f.html("默认栏目名称")}else{f.html(""+j+"")}if(j!=a){$("#saveButton").attr("disabled",false)}break;case 27:f.html(""+a+"");break}})};Fai.containsChinese=function(b){var a=/[\u4e00-\u9fa5]+/;return a.test(b)};Fai.refreshClass=function(a){a.children().each(function(){$(this).attr("class",$(this).attr("class"));Fai.refreshClass($(this))})};Fai.addInterval=function(d,c,a){if(Fai.isNull(Fai.intervalFunc)){Fai.intervalFunc=new Array()}for(var b=0;bq){C=h}else{if(A.length<3){C=Fai.format(r,3)}else{if(l.test(A)){C=d}else{if(!i.test(A)){C="请输入正确的名称"}else{if(!g.test(A)){C=v}else{if(!w.test(A)){C="请输入正确的名称"}}}}}}break;case"regHolder":if(A.length>q){C=h}else{if(A.length<2){C=Fai.format(r,2)}else{if(k.test(A)){C=v}else{if(l.test(A)){C=d}else{if(!i.test(A)){C="请输入正确的名称"}}}}}break;case"regUserNameEn":if(A.length>f){C=h}else{if(y.test(A)){C=s}}break;case"regHolderEn":if(A.length>f){C=h}else{if(y.test(A)){C=s}else{if(!x.test(A)){C="请用空格隔开姓名!"}}}console.log(C);break;case"regContact":var B=/^[▪·\u4e00-\u9fa5]+$/i;if(A.length<2){C=Fai.format(r,2)}else{if(t.test(A)&&!B.test(A)){C="请输入中文姓名"}}break;case"regAddr":if(A.length<5){C=Fai.format(r,5)}else{if(n.test(A)){C=d}else{if(!i.test(A)){C="请输入正确的地址"}else{if(!g.test(A)){C="请输入正确的地址"}}}}break;case"regAddrEn":if(A.length<5){C=Fai.format(r,5)}else{if(n.test(A)){C=d}else{if(!i.test(A)){C="请输入正确的地址"}}}break;case"regAddrCode":if(i.test(A)){C=d}else{if(A.length!=6){C="请输入6位数的邮编号码"}}break;case"regEmail":if(!Fai.isEmail(A)){C="请输入正确的电子邮箱"}break;case"regPhone":if(!Fai.isMobile(A)&&!m.test(A)){C="电话格式有误,固话请用横杆'-'隔开区号"}break;case"regFax":if(!m.test(A)){C="传真号码格式有误,请用横杆'-'隔开区号"}break}var z={};if(C!=undefined){z.success=false;z.msg=C}else{z.success=true}return z};this.checkAll=function(E,C){var z=["regContact","regContactEn","regProvince","regProvinceEn","regCity","regCityEn","regAddr","regAddrEn","regAddrCode","regPhone","regEmail"];if(E.regUserType==0){z.push("regUserName");z.push("regUserNameEn")}if(C&&C instanceof Array){z=a(z,C)}for(var B in z){var D=z[B];var A=this.check(D,E[D]);if(!A.success){console.log(D,A.msg);return false}}return true};function a(A,z){return A.filter(function(B){return z.indexOf(B)<0})}}Fai.domainInfoCheck=function(g){var b=$("#"+g).val();var f=g+"Err";var c=$("#"+g).parent().parent().find(".regLabelEx")[0];switch(g){case"regUserNameEn":if($("#regCompanyEnItem").css("display")=="none"){f="regUserNameErr"}break}if(!Fai.$_domain_validator){Fai.$_domain_validator=new DomainInfoValidator(true)}var d=Fai.$_domain_validator.check(g,b);var a=d.success;if(!a){$(c).hide();Fai.showErr(f,d.msg)}else{$(c).show();$("#"+f).hide()}return a};jQuery.extend(jQuery.fx.step,{opacity:function(a){var b=jQuery.style(a.elem,"opacity");if(b==null||b==""||b!=a.now){jQuery.style(a.elem,"opacity",a.now)}}});jQuery.extend(jQuery.easing,{faicount:10,failinear:function(f,h,a,j,i){var g=Math.abs(j-a)/jQuery.easing.faicount;if(g==0){return j}f=parseInt(f/g)*g;return jQuery.easing.linear(f,h,a,j,i)},easeOutQuart:function(f,g,a,i,h){return -i*((g=g/h-1)*g*g*g-1)+a}});Fai.easingFaiLinear=function(){jQuery.extend(jQuery.easing,{swing:function(f,g,a,i,h){return jQuery.easing.failinear(f,g,a,i,h)}})};Fai.getDivHeight=function(f){var d=Fai.getCssInt(f,"padding-top")+Fai.getCssInt(f,"padding-bottom");var c=Fai.getCssInt(f,"margin-top")+Fai.getCssInt(f,"margin-bottom");var b=Fai.getCssInt(f,"border-top-width")+Fai.getCssInt(f,"border-bottom-width");var a=f.height();return a+b+c+d};Fai.getDivWidth=function(f){var d=Fai.getCssInt(f,"padding-left")+Fai.getCssInt(f,"padding-right");var c=Fai.getCssInt(f,"margin-left")+Fai.getCssInt(f,"margin-right");var a=Fai.getCssInt(f,"border-left-width")+Fai.getCssInt(f,"border-right-width");var b=f.width();return b+a+c+d};Fai.getFrameHeight=function(d){var c=Fai.getCssInt(d,"padding-top")+Fai.getCssInt(d,"padding-bottom");var b=Fai.getCssInt(d,"margin-top")+Fai.getCssInt(d,"margin-bottom");var a=Fai.getCssInt(d,"border-top-width")+Fai.getCssInt(d,"border-bottom-width");return a+b+c};Fai.getFrameWidth=function(d){var c=Fai.getCssInt(d,"padding-left")+Fai.getCssInt(d,"padding-right");var b=Fai.getCssInt(d,"margin-left")+Fai.getCssInt(d,"margin-right");var a=Fai.getCssInt(d,"border-left-width")+Fai.getCssInt(d,"border-right-width");return a+b+c};Fai.showMenu=function(n){var r=n.id;if(Fai.isNull(r)){r=""}var p=n.host;var m=0;if(!Fai.isNull(n.mode)){m=n.mode}if(Fai.isNull(n.fixpos)){n.fixpos=true}var l=n.rulerObj;var g=n.navSysClass;if(Fai.isNull(g)){g=""}var f=0;if(!Fai.isNull(n.closeMode)){f=n.closeMode}var k=0;var q=0;if(m==1){k=p.offset().left+p.width();q=p.offset().top}else{k=p.offset().left;q=p.offset().top+p.height()}var c=$("#g_menu"+r);if(c.length!=0){if(f==0){c.attr("_mouseIn",1);return c}else{c.attr("_mouseIn",0);Fai.hideMenu();return null}}$(".g_menu").each(function(){$(this).remove()});var B=n.data;if(n.data==null||n.data==""){return null}c=$("
        ");c.appendTo($("body"));var u=$("
        ");u.appendTo(c);Fai.addMenuItem(B,u,n);if(n.fixpos){if(q+c.height()+20>$(document).height()){q=p.offset().top-c.height()}}c.css("left",k-Fai.getCssInt(u,"border-left-width")+"px");c.css("top",q+"px");if(f==0){c.mouseleave(function(){c.attr("_mouseIn",0);setTimeout("Fai.hideMenu()",100)});c.mouseover(function(){c.attr("_mouseIn",1)});c.click(function(){c.attr("_mouseIn",0);Fai.hideMenu()});p.mouseleave(function(){c.attr("_mouseIn",0);setTimeout("Fai.hideMenu()",100)});p.mouseover(function(){c.attr("_mouseIn",1)})}else{p.mousedown(function(){c.attr("_mouseIn",2)});c.bind("blur",function(){if(c.attr("_mouseIn")!=2){c.attr("_mouseIn",0);setTimeout("Fai.hideMenu()",100)}});c.focus()}if(typeof g_bindMenuMousewheel=="undefined"){g_bindMenuMousewheel=1;$("body").bind("mousewheel",function(){$("#g_menu").remove()})}c.attr("_mouseIn",1);c.slideDown(200);Fai.calcMenuSize(c,n);var s=$("#g_menu"+r+">div.content>table>tbody>tr>td.center>table.item");var w=$("#g_menu"+r);var C=(w.outerWidth()-w.width())+(w.find(".content").outerWidth()-w.find(".content").width())+(w.find(".content .middle").outerWidth()-w.find(".content .middle").width())+(w.find(".content .middle .left").outerWidth()-w.find(".content .middle .right").outerWidth())+(w.find(".content .middle .center").outerWidth()-w.find(".content .middle .center").width());var a=s.first().css("clear");var b=s.first().outerWidth();var j=s.length;if(a=="none"){if(j>1&&b>0){var y=b*j;var v=document.documentElement.clientWidth;var t=w.offset().left;var i=w.offset().right;var A=w.width();var d=p.offset().left;var h=l.outerWidth();var x=l.offset().left;var o=x+h;if(d>v/2){if(yv/2){var z=o-y;w.offset({left:z-C});w.find(".content>.middle").width("100%")}if(y.middle").width("100%")}if(y>v){if(v.middle").width("100%")}else{w.offset({left:x});w.find(".content>.middle").width("100%")}}}else{if(y.middle").width("100%")}if(y.middle").width("100%")}if(y>v){if(v.middle").width("100%")}else{w.offset({left:x});w.find(".content>.middle").width("100%")}}}}}return c};Fai.addMenuItem=function(t,b,j){if(t.length<=0){return}var d=["
        ","
        ","
        "];var n=$(d.join(""));n.appendTo(b);n=n.parent().find(".middle .center");for(var o=0;o"+q.html+"");var k=$(h.join(""));if(g){k.addClass("itemPopup")}if(n.find(" > .subMenu").length>=1){k.insertBefore(n.find(" > .subMenu").first())}else{k.appendTo(n)}if(g){if(g.length==0){}var m=$("");m.appendTo(n);var a=m.find(" > .content");Fai.addMenuItem(g,a,j);m.mouseleave(function(){$(this).attr("_mouseIn",0);setTimeout(function(){Fai.hideSubMenu()},100);if(j.navBar==true&&Fai.isIE()){var w=$("#g_menu"+j.id);var y=w.find(".contentLayer1");var i=y.outerHeight(true);var x=y.outerWidth(true);var v=y.children(".middle").first().outerWidth(true);w.css({width:x+"px",height:i+"px"});y.css({width:v+"px"})}});m.mouseover(function(){$(this).attr("_mouseIn",1)});m.click(function(){$(this).attr("_mouseIn",0);Fai.hideSubMenu()})}k.hover(function(){var A=$(this);var K=null;$(this).parent().find(" > .subMenu").each(function(M,L){if($(this).attr("itemId")==A.attr("itemId")){K=$(this)}});if(K!=null&&K.length==1){if(K.css("display")=="none"){if(K.attr("_hadShow")!=1){var v=A.position().left+A.width();var F=A.position().top;if(j.fixpos){var G=A.offset().top+K.height()+20-$(document).height();if(G>0){F=F-G}}K.css("left",v+"px");K.css("top",F+"px");K.slideDown(200);Fai.calcMenuSize(K,j);K.attr("_hadShow",1)}else{K.slideDown(200)}}K.attr("_mouseIn",1);if(j.navBar==true&&Fai.isIE()){var i=$("#g_menu"+j.id);var y=i.find(".contentLayer1");var w=K.find(".contentLayer2");var J=y.outerHeight(true);var E=y.outerWidth(true);var D=y.children(".middle").first().outerWidth(true);var I=w.outerHeight(true);var x=w.outerWidth(true);var H=K.position().top;var z=(I+H)-J;var C=z>0?(J+z):J;var B=E+x;i.css({width:B+"px",height:C+"px"});y.css({width:D+"px"})}}else{if($(this).parents(".subMenu").length<=0){if(j.navBar==true&&Fai.isIE()){var i=$("#g_menu"+j.id);var y=i.find(".contentLayer1");var D=y.children(".middle").first().outerWidth(true);var C=y.outerHeight(true);var B=y.outerWidth(true);i.css({width:B+"px",height:C+"px"});y.css({width:D+"px"})}}}A.addClass("itemHover");A.addClass("itemHoverIndex"+(A.index()+1));$(".g_menu").attr("_mouseIn",1)},function(){var i=$(this);var v=null;$(this).parent().find(" > .subMenu").each(function(){if($(this).attr("itemId")==i.attr("itemId")){v=$(this)}});if(v!=null&&v.length==1){v.attr("_mouseIn",0);setTimeout(function(){Fai.hideSubMenu()},100)}else{i.removeClass("itemHover");i.removeClass("itemHoverIndex"+(i.index()+1))}}).click(function(){$(".g_menu").attr("_mouseIn",0);setTimeout("Fai.hideMenu()",100)});if(j.closeMode==1){k.mousedown(function(){$(".g_menu").attr("_mouseIn",2)})}}};Fai.calcMenuSize=function(b,a){b.find(" > .content").each(function(){var d=$(" > .middle",this);var f=0;if(!Fai.isNull(a.minWidth)){f=a.minWidth-Fai.getCssInt(d.find(".left").first(),"width")-Fai.getCssInt(d.find(".right").first(),"width")}var g=f;var c=d.find(" > tbody > tr > .center > .item");c.each(function(){if($(this).width()>f){g=$(this).outerWidth();f=$(this).width()}});c.width(g);c.find(" > tbody > tr > .itemCenter").each(function(){var k=$(this);var h=k.parent().find(" > .itemLeft");var i=k.parent().find(" > .itemRight");k.css("width",(f-h.outerWidth()-i.outerWidth()-k.outerWidth()+k.width())+"px");var j=k.find("a");j.css("width",(k.width()-j.outerWidth()+j.width())+"px")});$(" > .top",this).width(d.width());$(" > .bottom",this).width(d.width())})};Fai.hideSubMenu=function(){$(".g_menu .subMenu").each(function(){var a=$(this);if(a.length!=1){return}if(a.attr("_mouseIn")==1){return}a.css("display","none");a.parent().find(" > .item").each(function(){if($(this).attr("itemId")==a.attr("itemId")){$(this).removeClass("itemHover")}})})};Fai.hideMenu=function(){$(".g_menu").each(function(){var a=$(this);if(a.length!=1){return}if(a.attr("_mouseIn")==1){return}a.remove()})};Fai.calcCtrlWidth=function(a,b){padding=Fai.getCssInt(b,"padding-left")+Fai.getCssInt(b,"padding-right");margin=Fai.getCssInt(b,"margin-left")+Fai.getCssInt(b,"margin-right");border=Fai.getCssInt(b,"border-left-width")+Fai.getCssInt(b,"border-right-width");b.width(a-padding-margin-border)};Fai.calcCtrlHeight=function(a,b){padding=Fai.getCssInt(b,"padding-top")+Fai.getCssInt(b,"padding-bottom");margin=Fai.getCssInt(b,"margin-top")+Fai.getCssInt(b,"margin-bottom");border=Fai.getCssInt(b,"border-top-width")+Fai.getCssInt(b,"border-bottom-width");b.height(a-padding-margin-border)};Fai.calcGridSize=function(c,a,d,b,k){if(c>0){var j=Fai.getCssInt(a,"padding-left")+Fai.getCssInt(a,"padding-right");var g=Fai.getCssInt(a,"margin-left")+Fai.getCssInt(a,"margin-right");var h=Fai.getCssInt(a,"border-left-width")+Fai.getCssInt(a,"border-right-width");a.css("overflow-x","hidden");a.width(c-j-h-g)}var f=0;if(d.css("display")!="none"){j=Fai.getCssInt(d,"padding-left")+Fai.getCssInt(d,"padding-right");g=Fai.getCssInt(d,"margin-left")+Fai.getCssInt(d,"margin-right");h=Fai.getCssInt(d,"border-left-width")+Fai.getCssInt(d,"border-right-width");f=d.width()+j+g+h}var i=0;if(k.css("display")!="none"){j=Fai.getCssInt(k,"padding-left")+Fai.getCssInt(k,"padding-right");g=Fai.getCssInt(k,"margin-left")+Fai.getCssInt(k,"margin-right");h=Fai.getCssInt(k,"border-left-width")+Fai.getCssInt(k,"border-right-width");i=k.width()+j+g+h}Fai.calcCtrlWidth(a.width()-f-i,b);j=Fai.getCssInt(b,"padding-top")+Fai.getCssInt(b,"padding-bottom");g=Fai.getCssInt(b,"margin-top")+Fai.getCssInt(b,"margin-bottom");h=Fai.getCssInt(b,"border-top-width")+Fai.getCssInt(b,"border-bottom-width");var l=b.height()+j+g+h;Fai.calcCtrlHeight(l,d);Fai.calcCtrlHeight(l,k)};Fai.removeBgStyle=function(a){if(a.attr("style")){style=a.attr("style").toLowerCase();if(style.indexOf("background-image")>-1){style=style.replace(/background-image[^;]*/gi,"")}if(style.indexOf("background-repeat")>-1){style=style.replace(/background-repeat[^;]*/gi,"")}if(style.indexOf("background-position")>-1){style=style.replace(/background-position[^;]*/gi,"")}if(style.indexOf("background-color")>-1){style=style.replace(/background-color[^;]*/gi,"")}if(style.indexOf("background")>-1){style=style.replace(/background[^;]*/gi,"")}if(style==""||style==null){a.removeAttr("style")}else{a.attr("style",style)}}};Fai.showTip=function(c){var a=new Array();if(!c.content){c.content=""}a.push("
        ");if(c.closeSwitch){a.push("
        ");a.push("")}else{a.push("
        ")}a.push(c.content);a.push("
        ");var d=a.join("");var b={content:d,className:"tip-yellowsimple",showTimeout:1,hideTimeout:0,alignTo:"target",alignX:"center",alignY:"top",offsetY:5,showOn:"none",hideAniDuration:0,id:"tip-yellowsimple"+parseInt(Math.random()*10000)};if(c.id){$.extend(b,{id:c.id})}if(c.showMode){if(c.showMode=="left"){$.extend(b,{alignX:"left",alignY:"center",offsetY:0,offsetX:5})}else{if(c.showMode=="right"){$.extend(b,{alignX:"right",alignY:"center",offsetY:0,offsetX:5})}else{if(c.showMode=="top"){$.extend(b,{alignX:"center",alignY:"top",offsetY:0,offsetX:5})}else{if(c.showMode=="bottom"){$.extend(b,{alignX:"center",alignY:"bottom",offsetY:0,offsetX:5})}}}}}if(c.data){$.extend(b,c.data)}if(c.appendToId){$.extend(b,{appendToId:c.appendToId})}if(c.autoLocation){$.extend(b,{autoLocation:c.autoLocation})}if(c.cusStyle){$.extend(b,{cusStyle:c.cusStyle})}var f=$(c.tid);f.poshytip("destroy");f.poshytip(b);f.poshytip("show");if(c.cls){$("#"+b.id).addClass(c.cls)}$("#"+b.id).find(".tip-btnClose").live("click",function(){if(c.beforeClose){c.beforeClose()}Fai.closeTip(c.tid)});if(c.autoTimeout){window.setTimeout(function(){if(c.beforeClose){c.beforeClose()}Fai.closeTip(c.tid)},c.autoTimeout)}};Fai.closeTip=function(a){if(typeof $(a).poshytip=="function"){$(a).poshytip("destroy")}};Fai.refreshTip=function(a){$(a).poshytip("hide");$(a).poshytip("show")};Fai.removeCss=function(d,a){var c=new RegExp(a+"[^;]*;","gi");var b=d.attr("style").replace(c,"");if(b==""||b==null){d.removeAttr("style")}else{d.attr("style",b)}};Fai.rgb2hex=function(b){if(b.charAt(0)=="#"){return b}var f=Number(b);var d=b.split(/\D+/);var a=Number(d[1])*65536+Number(d[2])*256+Number(d[3]);var c=a.toString(16);while(c.length<6){c="0"+c}return"#"+c};Fai.int2hex=function(a){var b=a.toString(16);while(b.length<6){b="0"+b}return"#"+b};Fai.setCtrlStyleCss=function(c,b,l,k,j){var a=$("#"+c);var h=new Array();if(a.length==1){var g=a.html();g=g.replace(/{\r\n/g,"{").replace(/\t/g,"").replace(/\r\n}/g,";}");h=g.split("\n");a.remove()}var d=new RegExp("#"+b+" +"+fixRegSpecialCharacter(l)+" *{ *"+k+"s*:[^;]*;","gi");if(b==""||b=="undefined"){d=new RegExp(fixRegSpecialCharacter(l)+" *{ *"+k+"s*:[^;]*;","gi")}for(var f=h.length-1;f>=0;--f){var m=h[f];if(m.length==0||/^\s$/.test(m)||d.test(m)){h.splice(f,1)}}if(b==""||b=="undefined"){h.push(l+"{"+k+":"+j+";}")}else{h.push("#"+b+" "+l+"{"+k+":"+j+";}")}$("head").append('")};Fai.setCtrlStyleCssList=function(c,b,j,p){var a=$("#"+c);var k=new Array();if(a.length==1){var h=a.html();h=h.replace(/{\r\n/g,"{").replace(/\t/g,"").replace(/\r\n}/g,";}");k=h.split("\n");a.remove()}for(var g=k.length-1;g>=0;--g){var o=k[g];for(var f=0;f'+k.join("\n")+"")};Fai.getCtrlStyleCss=function(d,c,k,j){var b=$("#"+d);if(b.length==0){return""}var h=b.html().split("\n");var f=new RegExp("#"+c+" +"+fixRegSpecialCharacter(k)+" *{ *"+j+"[^;]*;","gi");if(c==""||c=="undefined"){f=new RegExp(fixRegSpecialCharacter(k)+" *{ *"+j+"[^;]*;","gi")}for(var g=h.length-1;g>=0;--g){var l=h[g];var a=l.match(f);if(a&&a.length>=2){return a[1]}}return""};Fai.removeCtrlStyleCss=function(c,b,k,j){var a=$("#"+c);var h=new Array();if(a.length==1){var g=a.html();g=g.replace(/{\r\n/g,"{").replace(/\t/g,"").replace(/\r\n}/g,";}");h=g.split("\n");a.remove()}var d=new RegExp("#"+b+" +"+fixRegSpecialCharacter(k)+" *{ *"+j+"s*:[^;]*;","gi");if(b==""||b=="undefined"){d=new RegExp(fixRegSpecialCharacter(k)+" *{ *"+j+"s*:[^;]*;","gi")}for(var f=h.length-1;f>=0;--f){var l=h[f];if(l.length==0||/^\s$/.test(l)||d.test(l)){h.splice(f,1)}}$("head").append('")};Fai.removeCtrlStyleCssList=function(c,b,j){var a=$("#"+c);var k=new Array();if(a.length==1){var h=a.html();h=h.replace(/{\r\n/g,"{").replace(/\t/g,"").replace(/\r\n}/g,";}");k=h.split("\n");a.remove()}for(var g=k.length-1;g>=0;--g){var o=k[g];for(var f=0;f'+k.join("\n")+"")};function fixRegSpecialCharacter(b){var d=["\\",".","?","$","*","^","[","]","{","}","|","(",")","/"];for(var c=0,a=d.length;c'+f.join("\n")+"")};Fai.addBookmark=function(d,a){try{try{window.sidebar.addPanel(d,a,"")}catch(b){window.external.AddFavorite(a,d)}}catch(c){alert("收藏网站失败,请使用Ctrl+D进行添加。")}};Fai.setHomePage=function(c){if(typeof(c)=="undefined"){c=location.protocol+"//"+location.host}var b=false;if(typeof LS=="undefined"||typeof LS.setHomePageSuccess=="undefined"){b=true}if($.browser.msie){try{document.body.style.behavior="url(#default#homepage)";document.body.setHomePage(c)}catch(g){var f="您的浏览器暂时不支持自动设为首页,请手动添加。";if(!b){d=LS.setHomePageNotSupport}alert(f)}}else{if($.browser.mozilla){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch).setCharPref("browser.startup.homepage",c);var a="添加首页成功。";if(!b){a=LS.setHomePageSuccess}alert(a)}catch(g){var d="设置失败,请手动添加。";if(!b){d=LS.setHomePageError}alert(d)}}else{var f="您的浏览器暂时不支持自动设为首页,请手动添加。";if(!b){f=LS.setHomePageNotSupport}alert(f)}}};Fai.singleTextAreaAddMaxLength=function(b,a){if(typeof b!="undefined"&&typeof a!="undefined"){var c=$("#"+b);c.attr("maxlength",a);c.bind("keydown keyup change blur",function(){textAreaObjVal=c.val();textAreaObjLength=textAreaObjVal.length;if(textAreaObjLength>a){var d=textAreaObjVal.substr(0,a);c.val(d)}})}};Fai.parseFileSize=function(c){if(typeof c!="undefined"&&typeof c=="number"){var b;if(c<1024){b=c+"B"}else{if(c<1024*1024){var a=c/1024;b=a.toFixed(2)+"KB"}else{var a=c/(1024*1024);b=a.toFixed(2)+"MB"}}return b}else{return"-"}};Fai.compareObj=function(c,a,b){if(c===""){if(a===""){return 0}return 1}if(a===""){return -1}if(!isNaN(c)){if(!isNaN(a)){c=Math.floor(c);a=Math.floor(a)}else{if(b){return 1}else{return -1}}}else{if(!isNaN(a)){if(b){return -1}else{return 1}}}if(c>a){if(b){return -1}else{return 1}}else{if(c==a){return 0}else{if(b){return 1}else{return -1}}}};Fai.getScrollWidth=function(){var a;var b=document.createElement("div");b.style.cssText="overflow:scroll; width:100px; height:100px; background:transparent;";document.body.appendChild(b);a=b.offsetWidth-b.clientWidth;document.body.removeChild(b);return a};Fai.calculate=function(h,f,i){var k=0,d=0,b=0;try{d=h.toString().split(".")[1].length}catch(c){d=0}try{b=f.toString().split(".")[1].length}catch(c){b=0}switch(i){case 0:var j=Math.pow(10,Math.max(d,b));k=(h*j+f*j)/j;break;case 1:var a;var j=Math.pow(10,Math.max(d,b));a=(d>=b)?d:b;k=((h*j-f*j)/j).toFixed(a);break;case 2:k=g(h,f);break;case 3:k=g((Number(h.toString().replace(".",""))/Number(f.toString().replace(".",""))),Math.pow(10,b-d));break}return k;function g(n,l){var m=0;try{m+=n.toString().split(".")[1].length}catch(o){}try{m+=l.toString().split(".")[1].length}catch(o){}return Number(n.toString().replace(".",""))*Number(l.toString().replace(".",""))/Math.pow(10,m)}};(function(a){a.cookie=function(f,g,c){if(arguments.length>1&&(g===null||typeof g!=="object")){c=a.extend({},c);if(g===null){c.expires=-1}if(typeof c.expires==="number"){var i=c.expires,d=c.expires=new Date();d.setDate(d.getDate()+i)}return(document.cookie=[encodeURIComponent(f),"=",c.raw?String(g):encodeURIComponent(String(g)),c.expires?"; expires="+c.expires.toUTCString():"",c.path?"; path="+c.path:"",c.domain?"; domain="+c.domain:"",c.secure?"; secure":""].join(""))}c=g||{};var b,h=c.raw?function(j){return j}:decodeURIComponent;return(b=new RegExp("(?:^|; )"+encodeURIComponent(f)+"=([^;]*)").exec(document.cookie))?h(b[1]):null}})(jQuery);(function(c){var b=/["\\\x00-\x1f\x7f-\x9f]/g,d={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},a=Object.prototype.hasOwnProperty;c.toJSON=function(h){if(h===null){return"null"}var g,l,f,i,q=c.type(h);if(q==="undefined"){return undefined}if(q==="number"||q==="boolean"){return String(h)}if(q==="string"){return c.quoteString(h)}if(typeof h.toJSON==="function"){return c.toJSON(h.toJSON())}if(q==="date"){var n=h.getUTCMonth()+1,r=h.getUTCDate(),p=h.getUTCFullYear(),s=h.getUTCHours(),j=h.getUTCMinutes(),t=h.getUTCSeconds(),m=h.getUTCMilliseconds();if(n<10){n="0"+n}if(r<10){r="0"+r}if(s<10){s="0"+s}if(j<10){j="0"+j}if(t<10){t="0"+t}if(m<100){m="0"+m}if(m<10){m="0"+m}return'"'+p+"-"+n+"-"+r+"T"+s+":"+j+":"+t+"."+m+'Z"'}g=[];if(c.isArray(h)){for(l=0;l=12?"PM":"AM";t="";break;case" ":q+=v;t="";break;case"/":q+=v;t="";break;case":":q+=v;t="";break;default:if(t.length===2&&t.indexOf("y")!==0&&t!="SS"){q+=t.substring(0,1);t=t.substring(1,2)}else{if((t.length===3&&t.indexOf("yyy")===-1)){t=""}}}}return q}catch(r){return y}}}}())}(jQuery));(function(b,a){$window=b(a);b.fn.lazyload=function(c){var d={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:a,data_attribute:"original",skip_invisible:true,appear:null,load:null,lazyRemoveclass:""};if(c){if(undefined!==c.failurelimit){c.failure_limit=c.failurelimit;delete c.failurelimit}if(undefined!==c.effectspeed){c.effect_speed=c.effectspeed;delete c.effectspeed}b.extend(d,c)}var f=this;if(0==d.event.indexOf("scroll")){b(d.container).off("scroll.lazy");b(d.container).on("scroll.lazy",function(h){var g=0;f.each(function(){$this=b(this);if(d.skip_invisible&&!$this.is(":visible")){return}if(b.abovethetop(this,d)||b.leftofbegin(this,d)){}else{if(!b.belowthefold(this,d)&&!b.rightoffold(this,d)){$this.trigger("appear")}else{if(++g>d.failure_limit){}}}})})}this.each(function(){var g=this;var h=b(g);g.loaded=false;h.one("appear",function(){if(!this.loaded){if(d.appear){var i=f.length;d.appear.call(g,i,d)}b("").bind("load",function(){h.hide().removeClass(d.lazyRemoveclass).attr("src",h.data(d.data_attribute))[d.effect](d.effect_speed);g.loaded=true;var j=b.grep(f,function(l){return !l.loaded});f=b(j);if(d.load){var k=f.length;d.load.call(g,k,d)}}).attr("src",h.data(d.data_attribute)).removeClass(d.lazyRemoveclass)}});if(0!=d.event.indexOf("scroll")){h.bind(d.event,function(i){if(!g.loaded){h.trigger("appear")}})}});$window.bind("resize",function(g){b(d.container).trigger(d.event)});b(d.container).trigger(d.event);return this};b.belowthefold=function(d,f){if(f.container===undefined||f.container===a){var c=$window.height()+$window.scrollTop()}else{var c=b(f.container).offset().top+b(f.container).height()}return c<=b(d).offset().top-f.threshold};b.rightoffold=function(d,f){if(f.container===undefined||f.container===a){var c=$window.width()+$window.scrollLeft()}else{var c=b(f.container).offset().left+b(f.container).width()}return c<=b(d).offset().left-f.threshold};b.abovethetop=function(d,f){if(f.container===undefined||f.container===a){var c=$window.scrollTop()}else{var c=b(f.container).offset().top}return c>=b(d).offset().top+f.threshold+b(d).height()};b.leftofbegin=function(d,f){if(f.container===undefined||f.container===a){var c=$window.scrollLeft()}else{var c=b(f.container).offset().left}return c>=b(d).offset().left+f.threshold+b(d).width()};b.inviewport=function(c,d){return !b.rightofscreen(c,d)&&!b.leftofscreen(c,d)&&!b.belowthefold(c,d)&&!b.abovethetop(c,d)};b.extend(b.expr[":"],{"below-the-fold":function(c){return b.belowthefold(c,{threshold:0,container:a})},"above-the-top":function(c){return !b.belowthefold(c,{threshold:0,container:a})},"right-of-screen":function(c){return b.rightoffold(c,{threshold:0,container:a})},"left-of-screen":function(c){return !b.rightoffold(c,{threshold:0,container:a})},"in-viewport":function(c){return !b.inviewport(c,{threshold:0,container:a})},"above-the-fold":function(c){return !b.belowthefold(c,{threshold:0,container:a})},"right-of-fold":function(c){return b.rightoffold(c,{threshold:0,container:a})},"left-of-fold":function(c){return !b.rightoffold(c,{threshold:0,container:a})}})})(jQuery,window);(function(a){a.flag=function(k,m,j){if(typeof k!="number"){return null}var f={key:0,digit:32,options:"",setBoolean:""};if(m||m===0){a.extend(f,{key:k,options:m,setBoolean:j});if(typeof m==="number"){if(typeof f.setBoolean!="boolean"){if(f.options>=0&&f.options=0&&f.options0||l.length>0)){var b={};for(var h=0;h>16)+(z>>16)+(w>>16);return(v<<16)|(w&65535)}function s(u,v){return(u<>>(32-v))}function c(A,w,v,u,z,y){return o(s(o(o(w,A),o(u,y)),z),v)}function b(w,v,B,A,u,z,y){return c((v&B)|((~v)&A),w,v,u,z,y)}function i(w,v,B,A,u,z,y){return c((v&A)|(B&(~A)),w,v,u,z,y)}function n(w,v,B,A,u,z,y){return c(v^B^A,w,v,u,z,y)}function a(w,v,B,A,u,z,y){return c(B^(v|(~A)),w,v,u,z,y)}function d(F,A){F[A>>5]|=128<<((A)%32);F[(((A+64)>>>9)<<4)+14]=A;var w,z,y,v,u,E=1732584193,D=-271733879,C=-1732584194,B=271733878;for(w=0;w>5]>>>(w%32))&255)}return u}function j(v){var w,u=[];u[(v.length>>2)-1]=undefined;for(w=0;w>5]|=(v.charCodeAt(w/8)&255)<<(w%32)}return u}function k(u){return p(d(j(u),u.length*8))}function f(w,z){var v,y=j(w),u=[],x=[],A;u[15]=x[15]=undefined;if(y.length>16){y=d(y,w.length*8)}for(v=0;v<16;v+=1){u[v]=y[v]^909522486;x[v]=y[v]^1549556828}A=d(u.concat(j(z)),512+z.length*8);return p(d(x.concat(A),512+128))}function t(w){var z="0123456789abcdef",v="",u,y;for(y=0;y>>4)&15)+z.charAt(u&15)}return v}function m(u){return unescape(encodeURIComponent(u))}function q(u){return k(m(u))}function l(u){return t(q(u))}function h(u,v){return f(m(u),m(v))}function r(u,v){return t(h(u,v))}g.md5=function(v,w,u){if(!w){if(!u){return l(v)}else{return q(v)}}if(!u){return r(w,v)}else{return h(w,v)}}}(typeof jQuery==="function"?jQuery:this));(function(a){a.openURL=function(c,d,b){if(d){window.open(c,d,b)}else{window.open(c)}}})(jQuery);(function(a){a.jumpURL=function(b){window.location.href=b}})(jQuery);(function(a){a.hash=function(h,j){function c(k){return typeof k=="string"||Object.prototype.toString.call(k)==="[object String]"}if(!c(h)||h==""){return}var g=new RegExp("(&"+h+"=[^&]*)|(\\b"+h+"=[^&]*&)|(\\b"+h+"=[^&]*)","ig");var i=new RegExp("&*\\b"+h+"=[^&]*","i");if(typeof j=="undefined"){var b=window.location.hash.match(i);var f=b?b[0].indexOf("="):-1;if(f!=-1){b=a.trim(b[0].substring(f+1,b[0].length))}else{return null}return Fai.isMozilla()?b:decodeURIComponent(b)}else{if(j===null){window.location.hash=window.location.hash.replace(g,"")}else{j=j+"";var d=window.location.hash.replace(g,"");d+=((d.indexOf("=")!=-1)?"&":"")+h+"="+encodeURIComponent(j);window.location.hash=d}}}})(jQuery);(function(a){a.fn.numeric=function(d,f){if(typeof d==="boolean"){d={decimal:d}}d=d||{};if(typeof d.negative=="undefined"){d.negative=true}var b=(d.decimal===false)?"":d.decimal||".";var c=(d.negative===true)?true:false;f=(typeof(f)=="function"?f:function(){});return this.data("numeric.decimal",b).data("numeric.negative",c).data("numeric.callback",f).keypress(a.fn.numeric.keypress).keyup(a.fn.numeric.keyup).blur(a.fn.numeric.blur)};a.fn.numeric.keypress=function(h){var b=a.data(this,"numeric.decimal");var c=a.data(this,"numeric.negative");var d=h.charCode?h.charCode:h.keyCode?h.keyCode:0;if(d==13&&this.nodeName.toLowerCase()=="input"){return true}else{if(d==13){return false}}var f=false;if((h.ctrlKey&&d==97)||(h.ctrlKey&&d==65)){return true}if((h.ctrlKey&&d==120)||(h.ctrlKey&&d==88)){return true}if((h.ctrlKey&&d==99)||(h.ctrlKey&&d==67)){return true}if((h.ctrlKey&&d==122)||(h.ctrlKey&&d==90)){return true}if((h.ctrlKey&&d==118)||(h.ctrlKey&&d==86)||(h.shiftKey&&d==45)){return true}if(d<48||d>57){var g=a(this).val();if(g.indexOf("-")!==0&&c&&d==45&&(g.length===0||parseInt(a.fn.getSelectionStart(this),10)===0)){return true}if(b&&d==b.charCodeAt(0)&&g.indexOf(b)!=-1){f=false}if(d!=8&&d!=9&&d!=13&&d!=35&&d!=36&&d!=37&&d!=39&&d!=46){f=false}else{if(typeof h.charCode!="undefined"){if(h.keyCode==h.which&&h.which!==0){f=true;if(h.which==46){f=false}}else{if(h.keyCode!==0&&h.charCode===0&&h.which===0){f=true}}}}if(b&&d==b.charCodeAt(0)){if(g.indexOf(b)==-1){f=true}else{f=false}}}else{f=true}return f};a.fn.numeric.keyup=function(r){var l=a(this).val();if(l&&l.length>0){var f=a.fn.getSelectionStart(this);var u=a.fn.getSelectionEnd(this);var q=a.data(this,"numeric.decimal");var n=a.data(this,"numeric.negative");if(q!==""&&q!==null){var d=l.indexOf(q);if(d===0){this.value="0"+l}if(d==1&&l.charAt(0)=="-"){this.value="-0"+l.substring(1)}l=this.value}var c=[0,1,2,3,4,5,6,7,8,9,"-",q];var h=l.length;for(var p=h-1;p>=0;p--){var b=l.charAt(p);if(p!==0&&b=="-"){l=l.substring(0,p)+l.substring(p+1)}else{if(p===0&&!n&&b=="-"){l=l.substring(1)}}var g=false;for(var o=0;o0){for(var m=h-1;m>s;m--){var t=l.charAt(m);if(t==q){l=l.substring(0,m)+l.substring(m+1)}}}this.value=l;a.fn.setSelection(this,[f,u])}};a.fn.numeric.blur=function(){var b=a.data(this,"numeric.decimal");var f=a.data(this,"numeric.callback");var d=this.value;if(d!==""){var c=new RegExp("^\\d+$|^\\d*"+b+"\\d+$");if(!c.exec(d)){f.apply(this)}}};a.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).unbind("keypress",a.fn.numeric.keypress).unbind("blur",a.fn.numeric.blur)};a.fn.getSelectionStart=function(c){if(c.createTextRange){var b=document.selection.createRange().duplicate();b.moveEnd("character",c.value.length);if(b.text===""){return c.value.length}return c.value.lastIndexOf(b.text)}else{return c.selectionStart}};a.fn.getSelectionEnd=function(c){if(c.createTextRange){var b=document.selection.createRange().duplicate();b.moveStart("character",-c.value.length);return b.text.length}else{return c.selectionEnd}};a.fn.setSelection=function(d,c){if(typeof c=="number"){c=[c,c]}if(c&&c.constructor==Array&&c.length==2){if(d.createTextRange){var b=d.createTextRange();b.collapse(true);b.moveStart("character",c[0]);b.moveEnd("character",c[1]);b.select()}else{if(d.setSelectionRange){d.focus();d.setSelectionRange(c[0],c[1])}}}}})(jQuery);(function(d,c,f){var a,b;d.uaMatch=function(i){i=i.toLowerCase();var h=/(opr)[\/]([\w.]+)/.exec(i)||/(chrome)[ \/]([\w.]+)/.exec(i)||/(webkit)[ \/]([\w.]+)/.exec(i)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(i)||/(msie) ([\w.]+)/.exec(i)||i.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(i)||i.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(i)||[];var g=/(ipad)/.exec(i)||/(iphone)/.exec(i)||/(android)/.exec(i)||[];return{browser:h[1]||"",version:h[2]||"0",platform:g[0]||""}};a=d.uaMatch(c.navigator.userAgent);b={};if(a.browser){b[a.browser]=true;b.version=a.version}if(a.platform){b[a.platform]=true}if(b.chrome||b.opr){b.webkit=true}else{if(b.webkit){b.safari=true}}if(b.rv){b.msie=true}if(b.opr){b.opera=true}d.browser=b})(jQuery,window);(function(a){a.fn.removeCss=function(c){var b=[];var d=a.type(c);if(d==="array"){b=c}else{if(d==="object"){for(var f in c){b.push(f)}}else{if(d==="string"){b=c.replace(/,$/,"").split(",")}}}return this.each(function(){var g=a(this);a.map(b,function(h){g.css(h,"")})})}})(jQuery);(function(a){a.extend(a.fn,{livequery:function(f,d,c){var b=this,g;if(a.isFunction(f)){c=d,d=f,f=undefined}a.each(a.livequery.queries,function(h,j){if(b.selector==j.selector&&b.context==j.context&&f==j.type&&(!d||d.$lqguid==j.fn.$lqguid)&&(!c||c.$lqguid==j.fn2.$lqguid)){return(g=j)&&false}});g=g||new a.livequery(this.selector,this.context,f,d,c);g.stopped=false;g.run();return this},expire:function(f,d,c){var b=this;if(a.isFunction(f)){c=d,d=f,f=undefined}a.each(a.livequery.queries,function(g,h){if(b.selector==h.selector&&b.context==h.context&&(!f||f==h.type)&&(!d||d.$lqguid==h.fn.$lqguid)&&(!c||c.$lqguid==h.fn2.$lqguid)&&!this.stopped){a.livequery.stop(h.id)}});return this}});a.livequery=function(b,d,g,f,c){this.selector=b;this.context=d;this.type=g;this.fn=f;this.fn2=c;this.elements=[];this.stopped=false;this.id=a.livequery.queries.push(this)-1;f.$lqguid=f.$lqguid||a.livequery.guid++;if(c){c.$lqguid=c.$lqguid||a.livequery.guid++}return this};a.livequery.prototype={stop:function(){var b=this;if(this.type){this.elements.unbind(this.type,this.fn)}else{if(this.fn2){this.elements.each(function(c,d){b.fn2.apply(d)})}}this.elements=[];this.stopped=true},run:function(){if(this.stopped){return}var d=this;var f=this.elements,c=a(this.selector,this.context),b=c.not(f);this.elements=c;if(this.type){b.bind(this.type,this.fn);if(f.length>0){a.each(f,function(g,h){if(a.inArray(h,c)<0){a.event.remove(h,d.type,d.fn)}})}}else{b.each(function(){d.fn.apply(this)});if(this.fn2&&f.length>0){a.each(f,function(g,h){if(a.inArray(h,c)<0){d.fn2.apply(h)}})}}}};a.extend(a.livequery,{guid:0,queries:[],queue:[],running:false,timeout:null,checkQueue:function(){if(a.livequery.running&&a.livequery.queue.length){var b=a.livequery.queue.length;while(b--){a.livequery.queries[a.livequery.queue.shift()].run()}}},pause:function(){a.livequery.running=false},play:function(){a.livequery.running=true;a.livequery.run()},registerPlugin:function(){a.each(arguments,function(c,d){if(!a.fn[d]){return}var b=a.fn[d];a.fn[d]=function(){var f=b.apply(this,arguments);a.livequery.run();return f}})},run:function(b){if(b!=undefined){if(a.inArray(b,a.livequery.queue)<0){a.livequery.queue.push(b)}}else{a.each(a.livequery.queries,function(c){if(a.inArray(c,a.livequery.queue)<0){a.livequery.queue.push(c)}})}if(a.livequery.timeout){clearTimeout(a.livequery.timeout)}a.livequery.timeout=setTimeout(a.livequery.checkQueue,20)},stop:function(b){if(b!=undefined){a.livequery.queries[b].stop()}else{a.each(a.livequery.queries,function(c){a.livequery.queries[c].stop()})}}});a.livequery.registerPlugin("append","prepend","after","before","wrap","attr","removeAttr","addClass","removeClass","toggleClass","empty","remove","html");a(function(){a.livequery.play()})})(jQuery);Fai.compareObjNew=function(h,g,a,d,f){var c=h[d];var b=g[d];if(typeof c==="undefined"||typeof b==="undefined"){return}if(f==="number"){return Fai.ber(c,b,a)}if(Fai.isIE6()||Fai.isIE7()||Fai.isIE8()){return Fai.compareObjLocale(h,g,a,d)}return Fai.compareStrings(c,b,a)};Fai.compareObjLocale=function(g,f,a,d){var c=g[d];var b=f[d];if(typeof c==="number"||typeof c==="boolean"){c=c.toString()}if(typeof b==="number"||typeof b==="boolean"){b=b.toString()}if(a=="asc"){return c.localeCompare(b)}else{return b.localeCompare(c)}};Fai.ber=function(c,b,a){if(c===b){return 0}if(a=="asc"){return c>b?1:-1}else{return c>b?-1:1}};Fai.compareStrings=function(i,h,c){if(typeof i==="number"||typeof i==="boolean"){i=i.toString()}if(typeof h==="number"||typeof h==="boolean"){h=h.toString()}var j={str1:i,str2:h,len1:i.length,len2:h.length,pos1:0,pos2:0};var k=0;while(k==0&&j.pos10.5?(-1):1};Fai.punycode=function(){var o=2147483647,s=Math.floor,i=36,k=1,m=26,l=72,r=String.fromCharCode,j=700,v="-",d=i-k,f=38,c=128,n={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"};function a(z,x,y){var w=0;z=y?s(z/j):z>>1;z+=s(z/x);for(;z>d*m>>1;w+=i){z=s(z/d)}return s(w+(d+1)*z/(z+f))}function h(z){var y=[],x=0,A=z.length,B,w;while(x=55296&&B<=56319&&x65535){y-=65536;x+=r(y>>>10&1023|55296);y=56320|y&1023}x+=r(y);return x}).join("")}function t(y,w){var x=y.length;while(x--){y[x]=w(y[x])}return y}function g(I){var z,K,F,x,G,E,A,w,D,M,J,y=[],C,B,L,H;I=h(I);C=I.length;z=c;K=0;G=l;for(E=0;E=z&&Js((o-K)/B)){throw RangeError(n.overflow)}K+=(A-z)*B;z=A;for(E=0;Eo){throw RangeError(n.overflow)}if(J==z){for(w=K,D=i;;D+=i){M=D<=G?k:(D>=G+m?m:D-G);if(w=128){throw RangeError(n["not-basic"])}z.push(J.charCodeAt(D))}for(H=B>0?B+1:0;H=C){throw RangeError(n["invalid-input"])}I=b(J.charCodeAt(H++));if(I>=i||I>s((o-F)/K)){throw RangeError(n.overflow)}F+=I*K;M=A<=G?k:(A>=G+m?m:A-G);if(Is(o/L)){throw RangeError(n.overflow)}K*=L}E=z.length+1;G=a(F-x,E,x==0);if(s(F/E)>o-y){throw RangeError(n.overflow)}y+=s(F/E);F%=E;z.splice(F++,0,y)}return u(z)}return{encode:g,decode:p}}();Fai.isFontIcon=function(a){if(!a||a.length==0||a.length<"FontIcon_".length){return false}return a.substring(0,"FontIcon_".length)=="FontIcon_"};Fai.changeHeight=function(){var c=$(window).height()-40+"px";$(".tableContainer").css("min-height",c);$(".tablePanel , .panel").css("min-height",c);if($.browser.msie){$(".tableContainer").css("margin-top","0px");$(".tablePanel,.panel").css("margin-top","20px");$(".tableContainer").css("padding-bottom","20px");$(".tableContainer").css("height","auto");$(".tableContainer").css("padding-bottom","0px");var a=parseInt($(".tablePanel").height());var b=a+"px";if(a>parseInt(c)){$(".tableContainer").css("height",a);$(".tableContainer").css("padding-bottom","40px")}}}; \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/login/hawkEye.min.js b/len-sys/src/main/resources/plugin/login/hawkEye.min.js new file mode 100644 index 0000000..ca8b68d --- /dev/null +++ b/len-sys/src/main/resources/plugin/login/hawkEye.min.js @@ -0,0 +1 @@ +window.FAI_HAWK_EYE=!!window.FAI_HAWK_EYE?window.FAI_HAWK_EYE:{};window.FAI_HAWK_EYE.sdk_version=1.1;window.FAI_HAWK_EYE.FAI_HAWK_EYE_REPORT_URL=window.FAI_HAWK_EYE.jssdk_report_url;window.devicePixelRatio=window.devicePixelRatio||window.webkitDevicePixelRatio||window.mozDevicePixelRatio||1;(function(a,b){a._DEF={_MODULE:{_TYPE:{PV_MODULE:0,PERFORMANCE_MODULE:1,EXCEPTION_MODULE:2,CLICK_MODULE:3,EVENT_MODULE:4,BSS_MONITOR_MODULE:5,FAI_SPEED_TEST_MODULE:6},_KEY:{EXCEPTION_MODULE:"e_m",PERFORMANCE_MODULE:"pe_m",EVENT_MODULE:"b_m",PV_MODULE:"p_m",CLICK_MODULE:"c_m",BSS_MONITOR_MODULE:"bm_m",FAI_SPEED_TEST_MODULE:"fst_m"}},_COOKIE:{_AID_COOKIE:"",_BS_ADI_COOKIE:"",_BS_WID_COOKIE:"",_BS_ID_COOKIE:"",_CLI_ID_COOKIE:"_cliid"},_IDTYPE:{_DISTINC_ID:1,_SESSION_ID:2,_PV_ID:3,_CLICK_ID:4},_REPORT:{_BASIC:{_REPORT_TYPE:"b_rt",_PV_ID:"b_pi",_APP_ID:"b_a_i",_SDK_VERSION:"b_sv",_DISTINC_ID:"b_di",_CROSS_DOMAIN_CLI_ID:"b_cdci",_CLI_TIME:"b_ct",_AID:"b_ai",_BS_AID:"b_ba",_BS_WID:"b_bw",_BS_ID:"b_bi"},_URL:{_URL:"u_u",_REFER_URL:"u_ru"},_CLIENT:{_CLI_LANG:"c_l",_CLI_SCREEN_TYPE:"c_st",_CLI_DPR:"c_dpr"},_PERFORMANCE:{_DOMAIN_LOOKUP_TIME:"pe_dt",_TCP_TIME:"pe_tt",_REQUEST_TIME:"pe_rt",_BACK_END_TIME:"pe_rpt",_DOM_PARSE_TIME:"pe_dpt",_WRITER_SCREEN_TIME:"pe_wst",_FIRST_SCREEN_TIME:"pe_fst",_DOM_READY_TIME:"pe_drt",_FINISH_TIME:"pe_ft"},_EXCEPTION:{_EXCEPTION_TYPE:{_JS_EXCEPTION:0,_IMG_EXCEPTION:1,_AJAX_EXCEPTION:2},_TYPE:"e_t",_URL:"e_u",_MESSAGE:"e_m",_STATUS:"e_ss",_STACK:"e_sk",_LINE_NUM:"e_ln",_COL_NUM:"e_cn"},_EVENT:{_EVENT_ID:"ev_i",_EVENT_ID_SUB:"ev_i_s",_EVENT_CONTENT:"ev_c"},_CLICK:{_ID:"c_i",_PATH:"c_e_pa",_NAME:"c_e_n",_POSITION:"c_e_po",_TYPE:"c_t",_TO_URL:"c_t_u",_STEP_PV:"s_i_p"},_PV:{_REFER:"p_r",_TITLE:"p_t",_PV_ID:"p_pi"},_BSS:{_TIME:"bs_t",_MONITOR_ID:"bs_i"}}};a._DATA={};a._MODULES={};a._TOOL={};a._INTERFACE={}})(window.FAI_HAWK_EYE);(function(a,b){a._INTERFACE._install=function(){for(var c in a._MODULES){a._MODULES[c]._init()}};a._TOOL._extend=function(e,c){var d=function(){};d.prototype=c.prototype;e.prototype=new d();e.prototype.constructor=e;e.uber=c.prototype};a._TOOL._getElementPath=function(c){var d=[];do{d.push(a._TOOL._getElementName(c))}while((c.nodeName.toLowerCase()!="html")&&(c=c.parentNode));return d.join(" > ")};a._TOOL._getElementName=function(e){var d=e.className;var c=e.id;if(!!d||!!c){return e.nodeName.toLowerCase()+"["+(d?'class="'+d+'"':"")+(c?' id="'+c+'"':"")+"]"}else{return e.nodeName.toLowerCase()}};a._TOOL._getElementAttribute=function(d,c){var e=d.getAttribute(c);if(e==null||e==b){return""}else{return e}};a._TOOL._getLang=function(){var c=navigator.userLanguage||navigator.language;return c};a._TOOL._getScreenSize=function(){var e=window.screen.width,c=window.screen.height,f=window.devicePixelRatio;var g=parseInt(e*f);var d=parseInt(c*f);return g+"x"+d};a._TOOL._getDevicePixelRatio=function(){return window.devicePixelRatio};a._TOOL._getCookie=function(d){var c,e=new RegExp("(^| )"+d+"=([^;]*)(;|$)");if(c=document.cookie.match(e)){return unescape(c[2])}else{return null}};a._TOOL._getPageReferrer=function(){try{if(!!window.Fai&&!!window.Fai.top&&!!window.Fai.top.document){return window.Fai.top.document.referrer}else{return document.referrer}}catch(c){return document.referrer}};a._TOOL._sendReport=function(d,f){var g="";for(var e in f){g+=e+"="+encodeURIComponent(f[e])+"&"}d+="?"+g;var c=document.createElement("img");c.src=d;document.getElementsByTagName("head")[0].appendChild(c);c.parentNode.removeChild(c)};a._TOOL._getId=function(d){var g=(d).toString(16);if(g.length<2){for(var h=0;h<2-g.length;h++){g="0"+g}}var f=(((new Date().getTime())&4294967295)>>>0).toString(16);if(f.length<8){for(var h=0;h<8-f.length;h++){f="0"+f}}var c=16777215;var e=((Math.random()*c)&16777215).toString(16);if(e.length<6){for(var h=0;h<6-e.length;h++){e="0"+e}}return g+f+e};a._TOOL._getUrlDomain=function(c){var d=c.split("/")[2];if(d==b){d=""}return d}})(window.FAI_HAWK_EYE);(function(b){b.fai_he_pv_id=b._TOOL._getId(b._DEF._IDTYPE._PV_ID);b.fai_he_script_src="";if(document.currentScript&&document.currentScript.src){b.fai_he_script_src=document.currentScript.src}else{if(document.scripts){var a=document.scripts[document.scripts.length-1];if(a.src){b.fai_he_script_src=a.src}}}})(window.FAI_HAWK_EYE);(function(g){var c={};function a(){var l={};var o=g.fai_he_pv_id;var q=g.jssdk_appid;var k=g.sdk_version;var m=g._TOOL._getCookie(g._DEF._COOKIE._CLI_ID_COOKIE);var i=g.fai_aid;var p=g.fai_bs_aid;var j=g.fai_bs_wid;var n=g.fai_bs_id;l[g._DEF._REPORT._BASIC._PV_ID]=o;l[g._DEF._REPORT._BASIC._APP_ID]=q;l[g._DEF._REPORT._BASIC._SDK_VERSION]=k;l[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID]=m;l[g._DEF._REPORT._BASIC._AID]=i;l[g._DEF._REPORT._BASIC._BS_AID]=p;l[g._DEF._REPORT._BASIC._BS_WID]=j;l[g._DEF._REPORT._BASIC._BS_ID]=n;return l}function f(){var i={};var j=document.URL;var k=g._TOOL._getPageReferrer();i[g._DEF._REPORT._URL._URL]=j;i[g._DEF._REPORT._URL._REFER_URL]=k;return i}function e(){var l={};var k=g._TOOL._getLang();var i=g._TOOL._getScreenSize();var j=g._TOOL._getDevicePixelRatio();l[g._DEF._REPORT._CLIENT._CLI_LANG]=k;l[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE]=i;l[g._DEF._REPORT._CLIENT._CLI_DPR]=j;return l}var d=a();var b=f();var h=e();g._DATA[g._DEF._REPORT._BASIC._PV_ID]=d[g._DEF._REPORT._BASIC._PV_ID];g._DATA[g._DEF._REPORT._BASIC._APP_ID]=d[g._DEF._REPORT._BASIC._APP_ID];g._DATA[g._DEF._REPORT._BASIC._SDK_VERSION]=d[g._DEF._REPORT._BASIC._SDK_VERSION];g._DATA[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID]=d[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID];g._DATA[g._DEF._REPORT._BASIC._AID]=d[g._DEF._REPORT._BASIC._AID];g._DATA[g._DEF._REPORT._BASIC._BS_AID]=d[g._DEF._REPORT._BASIC._BS_AID];g._DATA[g._DEF._REPORT._BASIC._BS_WID]=d[g._DEF._REPORT._BASIC._BS_WID];g._DATA[g._DEF._REPORT._BASIC._BS_ID]=d[g._DEF._REPORT._BASIC._BS_ID];g._DATA[g._DEF._REPORT._URL._URL]=b[g._DEF._REPORT._URL._URL];g._DATA[g._DEF._REPORT._URL._REFER_URL]=b[g._DEF._REPORT._URL._REFER_URL];g._DATA[g._DEF._REPORT._CLIENT._CLI_LANG]=h[g._DEF._REPORT._CLIENT._CLI_LANG];g._DATA[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE]=h[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE];g._DATA[g._DEF._REPORT._CLIENT._CLI_DPR]=h[g._DEF._REPORT._CLIENT._CLI_DPR]})(window.FAI_HAWK_EYE);(function(e,k,c){if(!Function.prototype.bind){Function.prototype.bind=function(l){if(typeof this!=="function"){throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")}var p=Array.prototype.slice.call(arguments,1),o=this,m=function(){},n=function(){return o.apply(this instanceof m?this:l,p.concat(Array.prototype.slice.call(arguments)))};if(this.prototype){m.prototype=this.prototype}n.prototype=new m();return n}}function j(l,m){this._name=l;this._type=m}j.prototype.report=function(m,l){var o={};for(var n in k._DATA){o[n]=k._DATA[n]}for(var n in m){o[n]=m[n]}o[k._DEF._REPORT._BASIC._CLI_TIME]=new Date().getTime();o[k._DEF._REPORT._BASIC._REPORT_TYPE]=l;k._TOOL._sendReport(k.FAI_HAWK_EYE_REPORT_URL,o)};function g(l,m){this._name=l;this._type=m;this._init=function(){var o=this;if(e.addEventListener){e.addEventListener("error",function(q){var r={};if(q.target&&q.target.tagName&&(q.target.tagName.toLocaleLowerCase()=="img")){target_src_domain=k._TOOL._getUrlDomain(q.target.src);self_report_url=k.jssdk_report_url;if(self_report_url.indexOf(target_src_domain)==-1){r[k._DEF._REPORT._EXCEPTION._URL]=q.target.src;r[k._DEF._REPORT._EXCEPTION._STACK]="";r[k._DEF._REPORT._EXCEPTION._STATUS]=0;r[k._DEF._REPORT._EXCEPTION._LINE_NUM]=0;r[k._DEF._REPORT._EXCEPTION._COL_NUM]=0;r[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._IMG_EXCEPTION;o.report(r,o._type)}}},true)}e.onerror=function(u,s,t,B,r){if(u==="Script error."){return}if(s==k.fai_he_script_src){}var y={};var v=s;var x=u;var z="";if(r&&r.stack){z=r.stack}var w=0;var q=t;var A=0;if(B){A=B}y[k._DEF._REPORT._EXCEPTION._URL]=v;y[k._DEF._REPORT._EXCEPTION._MESSAGE]=x;y[k._DEF._REPORT._EXCEPTION._STACK]=z;y[k._DEF._REPORT._EXCEPTION._STATUS]=w;y[k._DEF._REPORT._EXCEPTION._LINE_NUM]=q;y[k._DEF._REPORT._EXCEPTION._COL_NUM]=A;y[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._JS_EXCEPTION;o.report(y,o._type)};if(e.XMLHttpRequest){var p=XMLHttpRequest.prototype.send;var n=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(s,r,q){n.apply(this,[s,r,q]);this.ajaxUrl=r};XMLHttpRequest.prototype.send=function(r){var s={};p.apply(this,[r]);if(this.onreadystatechange){this.newStateChange=q.bind(this)}else{this.onreadystatechange=q.bind(this)}function q(){if(this.readyState==4){if(!(this.status>=200&&this.status<300)){s[k._DEF._REPORT._EXCEPTION._URL]=this.ajaxUrl;s[k._DEF._REPORT._EXCEPTION._STACK]="";s[k._DEF._REPORT._EXCEPTION._STATUS]=this.status;s[k._DEF._REPORT._EXCEPTION._MESSAGE]=this.statusText;s[k._DEF._REPORT._EXCEPTION._LINE_NUM]=0;s[k._DEF._REPORT._EXCEPTION._COL_NUM]=0;s[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._AJAX_EXCEPTION;o.report(s,o._type)}}}}}}}k._TOOL._extend(g,j);k._MODULES[k._DEF._MODULE._KEY.EXCEPTION_MODULE]=new g("异常监控模块",k._DEF._MODULE._TYPE.EXCEPTION_MODULE);function f(l,m){this._name=l;this._type=m;this._init=function(){var o=this;if(!!e.addEventListener){e.addEventListener("load",function(p){setTimeout(function(){var q=n();o.report(q,o._type)},100)},false)}else{if(!!e.attachEvent){e.attachEvent("onload",function(p){setTimeout(function(){var q=n();o.report(q,o._type)},100)})}}};function n(){var s={};if(!!e.performance&&!!e.performance.timing){var o,x,t,q,v,u,w,p,r=null;o=performance.timing;x=o.domainLookupEnd-o.domainLookupStart;t=o.connectEnd-o.connectStart;q=o.responseEnd-o.requestStart;response_time=o.responseStart-o.navigationStart;v=o.domComplete-o.domInteractive;u=o.domInteractive-o.navigationStart;w=o.domComplete-o.navigationStart;p=o.domContentLoadedEventEnd-o.navigationStart;r=o.loadEventEnd-o.navigationStart;s[k._DEF._REPORT._PERFORMANCE._DOMAIN_LOOKUP_TIME]=x;s[k._DEF._REPORT._PERFORMANCE._TCP_TIME]=t;s[k._DEF._REPORT._PERFORMANCE._REQUEST_TIME]=q;s[k._DEF._REPORT._PERFORMANCE._BACK_END_TIME]=response_time;s[k._DEF._REPORT._PERFORMANCE._DOM_PARSE_TIME]=v;s[k._DEF._REPORT._PERFORMANCE._WRITER_SCREEN_TIME]=u;s[k._DEF._REPORT._PERFORMANCE._FIRST_SCREEN_TIME]=w;s[k._DEF._REPORT._PERFORMANCE._DOM_READY_TIME]=p;s[k._DEF._REPORT._PERFORMANCE._FINISH_TIME]=r}return s}}k._TOOL._extend(f,j);k._MODULES[k._DEF._MODULE._KEY.PERFORMANCE_MODULE]=new f("性能监控模块",k._DEF._MODULE._TYPE.PERFORMANCE_MODULE);function a(l,m){this._name=l;this._type=m;this._datas=[];this._init=function(){var n=this;k.trackEvent=function(r,p,q){var o={};o[k._DEF._REPORT._EVENT._EVENT_ID]=r;o[k._DEF._REPORT._EVENT._EVENT_ID_SUB]=p;o[k._DEF._REPORT._EVENT._EVENT_CONTENT]=q;n.report(o,n._type)}}}k._TOOL._extend(a,j);k._MODULES[k._DEF._MODULE._KEY.EVENT_MODULE]=new a("行为监控模块",k._DEF._MODULE._TYPE.EVENT_MODULE);function h(l,m){this._name=l;this._type=m;this._init=function(){var n=this;var o=(!!k._TOOL._getCookie(k._DEF._COOKIE._CLI_ID_COOKIE))?0:1000;setTimeout(function(){var p={};p[k._DEF._REPORT._PV._REFER]=document.referrer;p[k._DEF._REPORT._PV._TITLE]=document.title;p[k._DEF._REPORT._PV._PV_ID]=k.fai_he_pv_id;n.report(p,n._type)},o)}}k._TOOL._extend(h,j);k._MODULES[k._DEF._MODULE._KEY.PV_MODULE]=new h("PV模块",k._DEF._MODULE._TYPE.PV_MODULE);function b(l,m){this._name=l;this._type=m;this._step_pv=0;this._init=function(){var o=this;if(e.addEventListener){var q=true;var p=null;e.addEventListener("click",function(r){q=true;p=setTimeout(function(){if(q){n(r)}},400)});e.addEventListener("dblclick",function(r){q=false;clearTimeout(p);n(r)})}else{if(e.attachEvent){var q=true;var p=null;document.attachEvent("onclick",function(r){q=true;var s={};s.src=r.srcElement;s.screenX=r.screenX;s.screenY=r.screenY;s.type=r.type;p=setTimeout(function(){if(q){n(s)}},400)});document.attachEvent("ondblclick",function(r){q=false;clearTimeout(p);n(r)})}}function n(v){var w={};o._step_pv++;var s=k._TOOL._getId(k._DEF._IDTYPE._CLICK_ID);var x="";var r="";var t="";if(v.target){x=k._TOOL._getElementPath(v.target);r=k._TOOL._getElementName(v.target);t=k._TOOL._getElementAttribute(v.target,"href")}else{if(v.srcElement){x=k._TOOL._getElementPath(v.srcElement);r=k._TOOL._getElementName(v.srcElement);t=k._TOOL._getElementAttribute(v.srcElement,"href")}}var u=v.screenX+","+v.screenY;var y=v.type;w[k._DEF._REPORT._CLICK._ID]=s;w[k._DEF._REPORT._CLICK._PATH]=x;w[k._DEF._REPORT._CLICK._NAME]=r;w[k._DEF._REPORT._CLICK._POSITION]=u;w[k._DEF._REPORT._CLICK._TYPE]=v.type;w[k._DEF._REPORT._CLICK._TO_URL]=t;w[k._DEF._REPORT._CLICK._STEP_PV]=o._step_pv;o.report(w,o._type)}}}k._TOOL._extend(b,j);function i(l,m){this._name=l;this._type=m;this._init=function(){var n=this;k.bssMonitor=function(o){var p={};p[k._DEF._REPORT._BSS._MONITOR_ID]=o;p[k._DEF._REPORT._URL._URL]=document.URL;p[k._DEF._REPORT._BASIC._REPORT_TYPE]=n._type;k._TOOL._sendReport(k.FAI_HAWK_EYE_REPORT_URL,p)}}}k._TOOL._extend(i,j);k._MODULES[k._DEF._MODULE._KEY.BSS_MONITOR_MODULE]=new i("业务上报模块",k._DEF._MODULE._TYPE.BSS_MONITOR_MODULE);function d(p,q){this._name=p;this._type=q;this.testSeed=1;this._init=function(){var v=this;var u=((k.jssdk_appid==3010)&&(Math.random(1)*10<=5));var t=((k.jssdk_appid==6001)&&(Math.random(1)*10<=2));var s=((k.jssdk_appid==5002)&&(Math.random(1)*10<=1));if(false){if(!!e.addEventListener){e.addEventListener("load",function(w){setTimeout(function(){r()},1000)},false)}}};function n(s){s.domain=k._TOOL._getUrlDomain(s.url);if(!!JSON){k.trackEvent(10000,0,JSON.stringify(s))}}function r(){list=l();for(var s=0;sG%v+M4IFi6IoHX-daXF&;yS zA}*yZ;cF_Ts5Xh1BBjbLnzTh?zPW$F{pGH^*V_Bp`-p?=t$pWDCtEm72?hdz z;C6plxr+3$Xy!;sh}Q9_Uv)tsSiPOqdAG#E)tS`$?$=fOzYD_emS)(Q-Wpb~_OSWc zKh20fdVTE=%{`5E&>hJhb?m#(O92IM-1dm?qG3qoAsYi1(|hJB_L+rUsLA_JE+!4D zo5sqIktu&y+&xD0t*$pOpqfe zyew-wrt>)_PPH_o&o$`?H;Q}G7;zS^;y18pa>IhUr%N7e6Pp#U0+$o&fF=OUJ(7w4 zmeCwRhcL+~C$VptLDD|X@j3VaWL-@b9`)f#-%VMtsxV{{%~ z=BdXcI=ZXreU5QX7&nw=$^e^Qq}naLrqi?oFCmooMTO1J9<8|me-Rrp(!7b4KW-aH zEDtnnC$+n*+}-_P$g`fk4vdIG^i0lXnCUvNN;uSx876;9mSLB_`Th$bTQ#S)IK1!6 z-J2}a_|)ij#pm5AIXPErR@UDqoS;dy88O`BN;#4k{}`$X*S|EHbw+dcaxS1f1gWvMWU$}Tyjd=2e%Xke>n2IPO`mZX?qZ#G z-S!VE@fq7N88&{PB|W_Q)}!fbNPhfUA-V>^z_O{|v)OHQIyI*gEM!l;KOB0+IQ`4h z0W~=OFk36=a>j1Dk1XCGXi5s@KCp-hID6q3Mk}{ma?Y>;fsBQ_P@%$zA20owjRGIU z;ESs@D5O-QU)DwC#)St-#v^yqL=3{HXclng@0fe5Nuh%eYrdYV>qFm|Ao`Y#fO8s5 zI}HC6Pq_oFg}yw9(+v$cTN;uN)Vs~lS2o`!J$*iF`k{D4>~3YW1^hsD0_}Q+BYSA# zL8x-|Cm;my^<0Vv*E>%tPe7;4Fw4Fn3rWMsYOy>CJ^BLIpF14B)d6`f?gZVt6t|)! zu#5>7kVci8Kb%`X<-7#!MYXjZirXYLbRh}dh~jYv#Bb!m@((=8tDrh|or>SLGCwt3 z_Gv0*K1PHYpFJPFic>7f%d9h=+~{R7Fvn&EUsRq=ru`njJh%~V5YqESX}@YCcv+2| ze$!I)e&mq$3n$Yi*1lbI7q9=%nUN5%8~qC(Zk}gx>z~lJqRM)S1yxFh7pAr0FVnJf zcP_ymn^yj>O!&4Pdg?1h;FM7H_?hK zEL0#^bgcu|g!=;!d~s`bhN2M$Fnoj}CN9m0=xo2W;pP^kv99f4@gX4_PP9u>=(~9p zt3=7tCCyp(=%gqLO^j4^GF^6<#E)c1dAH6t*T>JE;$O2`uEjB62W-B#8xiHE$Bs#t z3#mrLW3QFT7FgtBnv|&)pT1x>bsSJ9;2^UW=6w1*;bht-7MTl?!bc=?api;)SmdZ$ z=_kREwQZMi|N8W3ik?9$Rv6Tl2TtCUPpH zT|2OJv|Sbtt}Tt!Xcp9Pk$nx+yG7SNs3nJOBE{~45+XOeB*w%URpWCVfdl~wG^5q80|6wZ2sLLwG93oBF> za`?oSA)4cML|00E%{d$w=l6W+=T2rjQR$npnbNy9(fy3;Y#qSX_; zgCfn&qqLlP;n~}+eB__!Cx;8*gE}t!&B-}cfSVdhu9b0$jG=$=3`~(n?!S+2m z#kb`(-;H^_4m&~9;M3zEroA1W7i{#o^vZiYNyRX{p`$h7&@-e?)W!dcOm^$kGtsj8 zUMIv9q-DF}+ooin_fVB)q(Wu!a-zQVR*Llwdi!UcKBJP|@#rRYLH~Gv3j!tfQan+1 zY8wZi!l;^_CCzEYsn(rp|9Zwm9i$Cj6q5;FONF+X`$~%gGonV6!$*KyBGpp!yM%sLT zZ&PPsFkuIAFAokYQ6<#bztvz7ncWmF_thJ$G4A?-kUp|Zm04o_(`9yb)TKdenR_L}$gkt2OB6Zl^zy8Z$ b%)[^>]*$|#([\w\-]*)$)/,a=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,bf=/^[\],:{}\s]*$/,bi=/(?:^|:|,)(?:\s*\[)+/g,bD=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,a0=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,bP=/^-ms-/,aU=/-([\da-z])/gi,N=function(e,bZ){return(bZ+"").toUpperCase()},aF=function(){if(o.addEventListener){o.removeEventListener("DOMContentLoaded",aF,false);bG.ready()}else{if(o.readyState==="complete"){o.detachEvent("onreadystatechange",aF);bG.ready()}}},Z={};bG.fn=bG.prototype={constructor:bG,init:function(e,b2,b1){var b0,b3,bZ,b4;if(!e){return this}if(e.nodeType){this.context=this[0]=e;this.length=1;return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){b0=[null,e,null]}else{b0=bo.exec(e)}if(b0&&(b0[1]||!b2)){if(b0[1]){b2=b2 instanceof bG?b2[0]:b2;b4=(b2&&b2.nodeType?b2.ownerDocument||b2:o);e=bG.parseHTML(b0[1],b4,true);if(a.test(b0[1])&&bG.isPlainObject(b2)){this.attr.call(e,b2,true)}return bG.merge(this,e)}else{b3=o.getElementById(b0[2]);if(b3&&b3.parentNode){if(b3.id!==b0[2]){return b1.find(e)}this.length=1;this[0]=b3}this.context=o;this.selector=e;return this}}else{if(!b2||b2.jquery){return(b2||b1).find(e)}else{return this.constructor(b2).find(e)}}}else{if(bG.isFunction(e)){return b1.ready(e)}}if(e.selector!==aB){this.selector=e.selector;this.context=e.context}return bG.makeArray(e,this)},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return a4.call(this)},get:function(e){return e==null?this.toArray():(e<0?this[this.length+e]:this[e])},pushStack:function(bZ,b1,e){var b0=bG.merge(this.constructor(),bZ);b0.prevObject=this;b0.context=this.context;if(b1==="find"){b0.selector=this.selector+(this.selector?" ":"")+e}else{if(b1){b0.selector=this.selector+"."+b1+"("+e+")"}}return b0},each:function(bZ,e){return bG.each(this,bZ,e)},ready:function(e){bG.ready.promise().done(e);return this},eq:function(e){e=+e;return e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(a4.apply(this,arguments),"slice",a4.call(arguments).join(","))},map:function(e){return this.pushStack(bG.map(this,function(b0,bZ){return e.call(b0,bZ,b0)}))},end:function(){return this.prevObject||this.constructor(null)},push:am,sort:[].sort,splice:[].splice};bG.fn.init.prototype=bG.fn;bG.extend=bG.fn.extend=function(){var b7,b0,e,bZ,b4,b5,b3=arguments[0]||{},b2=1,b1=arguments.length,b6=false;if(typeof b3==="boolean"){b6=b3;b3=arguments[1]||{};b2=2}if(typeof b3!=="object"&&!bG.isFunction(b3)){b3={}}if(b1===b2){b3=this;--b2}for(;b20){return}af.resolveWith(o,[bG]);if(bG.fn.trigger){bG(o).trigger("ready").off("ready")}},isFunction:function(e){return bG.type(e)==="function"},isArray:Array.isArray||function(e){return bG.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return !isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):Z[z.call(e)]||"object"},isPlainObject:function(b1){if(!b1||bG.type(b1)!=="object"||b1.nodeType||bG.isWindow(b1)){return false}try{if(b1.constructor&&!V.call(b1,"constructor")&&!V.call(b1.constructor.prototype,"isPrototypeOf")){return false}}catch(b0){return false}var bZ;for(bZ in b1){}return bZ===aB||V.call(b1,bZ)},isEmptyObject:function(bZ){var e;for(e in bZ){return false}return true},error:function(e){throw new Error(e)},parseHTML:function(b1,b0,e){var bZ;if(!b1||typeof b1!=="string"){return null}if(typeof b0==="boolean"){e=b0;b0=0}b0=b0||o;if((bZ=a.exec(b1))){return[b0.createElement(bZ[1])]}bZ=bG.buildFragment([b1],b0,e?null:[]);return bG.merge([],(bZ.cacheable?bG.clone(bZ.fragment):bZ.fragment).childNodes)},parseJSON:function(e){if(!e||typeof e!=="string"){return null}e=bG.trim(e);if(a2.JSON&&a2.JSON.parse){return a2.JSON.parse(e)}if(bf.test(e.replace(bD,"@").replace(a0,"]").replace(bi,""))){return(new Function("return "+e))()}bG.error("Invalid JSON: "+e)},parseXML:function(b1){var bZ,b0;if(!b1||typeof b1!=="string"){return null}try{if(a2.DOMParser){b0=new DOMParser();bZ=b0.parseFromString(b1,"text/xml")}else{bZ=new ActiveXObject("Microsoft.XMLDOM");bZ.async="false";bZ.loadXML(b1)}}catch(b2){bZ=aB}if(!bZ||!bZ.documentElement||bZ.getElementsByTagName("parsererror").length){bG.error("Invalid XML: "+b1)}return bZ},noop:function(){},globalEval:function(e){if(e&&aa.test(e)){(a2.execScript||function(bZ){a2["eval"].call(a2,bZ)})(e)}},camelCase:function(e){return e.replace(bP,"ms-").replace(aU,N)},nodeName:function(bZ,e){return bZ.nodeName&&bZ.nodeName.toLowerCase()===e.toLowerCase()},each:function(b3,b4,b0){var bZ,b1=0,b2=b3.length,e=b2===aB||bG.isFunction(b3);if(b0){if(e){for(bZ in b3){if(b4.apply(b3[bZ],b0)===false){break}}}else{for(;b10&&e[0]&&e[bZ-1])||bZ===0||bG.isArray(e));if(b1){for(;b0-1){b5.splice(ca,1);if(b2){if(ca<=b3){b3--}if(ca<=b4){b4--}}}})}return this},has:function(b9){return bG.inArray(b9,b5)>-1},empty:function(){b5=[];return this},disable:function(){b5=b6=b1=aB;return this},disabled:function(){return !b5},lock:function(){b6=aB;if(!b1){b7.disable()}return this},locked:function(){return !b6},fireWith:function(ca,b9){b9=b9||[];b9=[ca,b9.slice?b9.slice():b9];if(b5&&(!e||b6)){if(b2){b6.push(b9)}else{bZ(b9)}}return this},fire:function(){b7.fireWith(this,arguments);return this},fired:function(){return !!e}};return b7};bG.extend({Deferred:function(b0){var bZ=[["resolve","done",bG.Callbacks("once memory"),"resolved"],["reject","fail",bG.Callbacks("once memory"),"rejected"],["notify","progress",bG.Callbacks("memory")]],b1="pending",b2={state:function(){return b1},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b3=arguments;return bG.Deferred(function(b4){bG.each(bZ,function(b6,b5){var b8=b5[0],b7=b3[b6];e[b5[1]](bG.isFunction(b7)?function(){var b9=b7.apply(this,arguments);if(b9&&bG.isFunction(b9.promise)){b9.promise().done(b4.resolve).fail(b4.reject).progress(b4.notify)}else{b4[b8+"With"](this===e?b4:this,[b9])}}:b4[b8])});b3=null}).promise()},promise:function(b3){return b3!=null?bG.extend(b3,b2):b2}},e={};b2.pipe=b2.then;bG.each(bZ,function(b4,b3){var b6=b3[2],b5=b3[3];b2[b3[1]]=b6.add;if(b5){b6.add(function(){b1=b5},bZ[b4^1][2].disable,bZ[2][2].lock)}e[b3[0]]=b6.fire;e[b3[0]+"With"]=b6.fireWith});b2.promise(e);if(b0){b0.call(e,e)}return e},when:function(b2){var b0=0,b4=a4.call(arguments),e=b4.length,bZ=e!==1||(b2&&bG.isFunction(b2.promise))?e:0,b7=bZ===1?b2:bG.Deferred(),b1=function(b9,ca,b8){return function(cb){ca[b9]=this;b8[b9]=arguments.length>1?a4.call(arguments):cb;if(b8===b6){b7.notifyWith(ca,b8)}else{if(!(--bZ)){b7.resolveWith(ca,b8)}}}},b6,b3,b5;if(e>1){b6=new Array(e);b3=new Array(e);b5=new Array(e);for(;b0
        a";ca=b0.getElementsByTagName("*");b8=b0.getElementsByTagName("a")[0];b8.style.cssText="top:1px;float:left;opacity:.5";if(!ca||!ca.length){return{}}b9=o.createElement("select");b2=b9.appendChild(o.createElement("option"));b7=b0.getElementsByTagName("input")[0];cb={leadingWhitespace:(b0.firstChild.nodeType===3),tbody:!b0.getElementsByTagName("tbody").length,htmlSerialize:!!b0.getElementsByTagName("link").length,style:/top/.test(b8.getAttribute("style")),hrefNormalized:(b8.getAttribute("href")==="/a"),opacity:/^0.5/.test(b8.style.opacity),cssFloat:!!b8.style.cssFloat,checkOn:(b7.value==="on"),optSelected:b2.selected,getSetAttribute:b0.className!=="t",enctype:!!o.createElement("form").enctype,html5Clone:o.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",boxModel:(o.compatMode==="CSS1Compat"),submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,boxSizingReliable:true,pixelPosition:false};b7.checked=true;cb.noCloneChecked=b7.cloneNode(true).checked;b9.disabled=true;cb.optDisabled=!b2.disabled;try{delete b0.test}catch(b5){cb.deleteExpando=false}if(!b0.addEventListener&&b0.attachEvent&&b0.fireEvent){b0.attachEvent("onclick",bZ=function(){cb.noCloneEvent=false});b0.cloneNode(true).fireEvent("onclick");b0.detachEvent("onclick",bZ)}b7=o.createElement("input");b7.value="t";b7.setAttribute("type","radio");cb.radioValue=b7.value==="t";b7.setAttribute("checked","checked");b7.setAttribute("name","t");b0.appendChild(b7);b6=o.createDocumentFragment();b6.appendChild(b0.lastChild);cb.checkClone=b6.cloneNode(true).cloneNode(true).lastChild.checked;cb.appendChecked=b7.checked;b6.removeChild(b7);b6.appendChild(b0);if(b0.attachEvent){for(b3 in {submit:true,change:true,focusin:true}){b4="on"+b3;b1=(b4 in b0);if(!b1){b0.setAttribute(b4,"return;");b1=(typeof b0[b4]==="function")}cb[b3+"Bubbles"]=b1}}bG(function(){var cc,cg,ce,cf,cd="padding:0;margin:0;border:0;display:block;overflow:hidden;",e=o.getElementsByTagName("body")[0];if(!e){return}cc=o.createElement("div");cc.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";e.insertBefore(cc,e.firstChild);cg=o.createElement("div");cc.appendChild(cg);cg.innerHTML="
        t
        ";ce=cg.getElementsByTagName("td");ce[0].style.cssText="padding:0;margin:0;border:0;display:none";b1=(ce[0].offsetHeight===0);ce[0].style.display="";ce[1].style.display="none";cb.reliableHiddenOffsets=b1&&(ce[0].offsetHeight===0);cg.innerHTML="";cg.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";cb.boxSizing=(cg.offsetWidth===4);cb.doesNotIncludeMarginInBodyOffset=(e.offsetTop!==1);if(a2.getComputedStyle){cb.pixelPosition=(a2.getComputedStyle(cg,null)||{}).top!=="1%";cb.boxSizingReliable=(a2.getComputedStyle(cg,null)||{width:"4px"}).width==="4px";cf=o.createElement("div");cf.style.cssText=cg.style.cssText=cd;cf.style.marginRight=cf.style.width="0";cg.style.width="1px";cg.appendChild(cf);cb.reliableMarginRight=!parseFloat((a2.getComputedStyle(cf,null)||{}).marginRight)}if(typeof cg.style.zoom!=="undefined"){cg.innerHTML="";cg.style.cssText=cd+"width:1px;padding:1px;display:inline;zoom:1";cb.inlineBlockNeedsLayout=(cg.offsetWidth===3);cg.style.display="block";cg.style.overflow="visible";cg.innerHTML="
        ";cg.firstChild.style.width="5px";cb.shrinkWrapBlocks=(cg.offsetWidth!==3);cc.style.zoom=1}e.removeChild(cc);cc=cg=ce=cf=null});b6.removeChild(b0);ca=b8=b9=b2=b7=b6=b0=null;return cb})();var bt=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,aL=/([A-Z])/g;bG.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(bG.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?bG.cache[e[bG.expando]]:e[bG.expando];return !!e&&!O(e)},data:function(b1,bZ,b3,b2){if(!bG.acceptData(b1)){return}var b4,b6,b7=bG.expando,b5=typeof bZ==="string",b8=b1.nodeType,e=b8?bG.cache:b1,b0=b8?b1[b7]:b1[b7]&&b7;if((!b0||!e[b0]||(!b2&&!e[b0].data))&&b5&&b3===aB){return}if(!b0){if(b8){b1[b7]=b0=bG.deletedIds.pop()||bG.guid++}else{b0=b7}}if(!e[b0]){e[b0]={};if(!b8){e[b0].toJSON=bG.noop}}if(typeof bZ==="object"||typeof bZ==="function"){if(b2){e[b0]=bG.extend(e[b0],bZ)}else{e[b0].data=bG.extend(e[b0].data,bZ)}}b4=e[b0];if(!b2){if(!b4.data){b4.data={}}b4=b4.data}if(b3!==aB){b4[bG.camelCase(bZ)]=b3}if(b5){b6=b4[bZ];if(b6==null){b6=b4[bG.camelCase(bZ)]}}else{b6=b4}return b6},removeData:function(b1,bZ,b2){if(!bG.acceptData(b1)){return}var b5,b4,b3,b6=b1.nodeType,e=b6?bG.cache:b1,b0=b6?b1[bG.expando]:bG.expando;if(!e[b0]){return}if(bZ){b5=b2?e[b0]:e[b0].data;if(b5){if(!bG.isArray(bZ)){if(bZ in b5){bZ=[bZ]}else{bZ=bG.camelCase(bZ);if(bZ in b5){bZ=[bZ]}else{bZ=bZ.split(" ")}}}for(b4=0,b3=bZ.length;b41,null,false)},removeData:function(e){return this.each(function(){bG.removeData(this,e)})}});function bv(b1,b0,b2){if(b2===aB&&b1.nodeType===1){var bZ="data-"+b0.replace(aL,"-$1").toLowerCase();b2=b1.getAttribute(bZ);if(typeof b2==="string"){try{b2=b2==="true"?true:b2==="false"?false:b2==="null"?null:+b2+""===b2?+b2:bt.test(b2)?bG.parseJSON(b2):b2}catch(b3){}bG.data(b1,b0,b2)}else{b2=aB}}return b2}function O(bZ){var e;for(e in bZ){if(e==="data"&&bG.isEmptyObject(bZ[e])){continue}if(e!=="toJSON"){return false}}return true}bG.extend({queue:function(b0,bZ,b1){var e;if(b0){bZ=(bZ||"fx")+"queue";e=bG._data(b0,bZ);if(b1){if(!e||bG.isArray(b1)){e=bG._data(b0,bZ,bG.makeArray(b1))}else{e.push(b1)}}return e||[]}},dequeue:function(b3,b2){b2=b2||"fx";var bZ=bG.queue(b3,b2),b4=bZ.length,b1=bZ.shift(),e=bG._queueHooks(b3,b2),b0=function(){bG.dequeue(b3,b2)};if(b1==="inprogress"){b1=bZ.shift();b4--}if(b1){if(b2==="fx"){bZ.unshift("inprogress")}delete e.stop;b1.call(b3,b0,e)}if(!b4&&e){e.empty.fire()}},_queueHooks:function(b0,bZ){var e=bZ+"queueHooks";return bG._data(b0,e)||bG._data(b0,e,{empty:bG.Callbacks("once memory").add(function(){bG.removeData(b0,bZ+"queue",true);bG.removeData(b0,e,true)})})}});bG.fn.extend({queue:function(e,bZ){var b0=2;if(typeof e!=="string"){bZ=e;e="fx";b0--}if(arguments.length1)},removeAttr:function(e){return this.each(function(){bG.removeAttr(this,e)})},prop:function(e,bZ){return bG.access(this,bG.prop,e,bZ,arguments.length>1)},removeProp:function(e){e=bG.propFix[e]||e;return this.each(function(){try{this[e]=aB;delete this[e]}catch(bZ){}})},addClass:function(b2){var b4,b0,bZ,b1,b3,b5,e;if(bG.isFunction(b2)){return this.each(function(b6){bG(this).addClass(b2.call(this,b6,this.className))})}if(b2&&typeof b2==="string"){b4=b2.split(aV);for(b0=0,bZ=this.length;b0=0){b2=b2.replace(" "+b1[b5]+" "," ")}}b3.className=b4?bG.trim(b2):""}}}return this},toggleClass:function(b1,bZ){var b0=typeof b1,e=typeof bZ==="boolean";if(bG.isFunction(b1)){return this.each(function(b2){bG(this).toggleClass(b1.call(this,b2,this.className,bZ),bZ)})}return this.each(function(){if(b0==="string"){var b4,b3=0,b2=bG(this),b5=bZ,b6=b1.split(aV);while((b4=b6[b3++])){b5=e?b5:!b2.hasClass(b4);b2[b5?"addClass":"removeClass"](b4)}}else{if(b0==="undefined"||b0==="boolean"){if(this.className){bG._data(this,"__className__",this.className)}this.className=this.className||b1===false?"":bG._data(this,"__className__")||""}}})},hasClass:function(e){var b1=" "+e+" ",b0=0,bZ=this.length;for(;b0=0){return true}}return false},val:function(b1){var e,bZ,b2,b0=this[0];if(!arguments.length){if(b0){e=bG.valHooks[b0.type]||bG.valHooks[b0.nodeName.toLowerCase()];if(e&&"get" in e&&(bZ=e.get(b0,"value"))!==aB){return bZ}bZ=b0.value;return typeof bZ==="string"?bZ.replace(ai,""):bZ==null?"":bZ}return}b2=bG.isFunction(b1);return this.each(function(b4){var b5,b3=bG(this);if(this.nodeType!==1){return}if(b2){b5=b1.call(this,b4,b3.val())}else{b5=b1}if(b5==null){b5=""}else{if(typeof b5==="number"){b5+=""}else{if(bG.isArray(b5)){b5=bG.map(b5,function(b6){return b6==null?"":b6+""})}}}e=bG.valHooks[this.type]||bG.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,b5,"value")===aB){this.value=b5}})}});bG.extend({valHooks:{option:{get:function(e){var bZ=e.attributes.value;return !bZ||bZ.specified?e.value:e.text}},select:{get:function(e){var b4,bZ,b3,b1,b2=e.selectedIndex,b5=[],b6=e.options,b0=e.type==="select-one";if(b2<0){return null}bZ=b0?b2:0;b3=b0?b2+1:b6.length;for(;bZ=0});if(!e.length){bZ.selectedIndex=-1}return e}}},attrFn:{},attr:function(b4,b1,b5,b3){var b0,e,b2,bZ=b4.nodeType;if(!b4||bZ===3||bZ===8||bZ===2){return}if(b3&&bG.isFunction(bG.fn[b1])){return bG(b4)[b1](b5)}if(typeof b4.getAttribute==="undefined"){return bG.prop(b4,b1,b5)}b2=bZ!==1||!bG.isXMLDoc(b4);if(b2){b1=b1.toLowerCase();e=bG.attrHooks[b1]||(M.test(b1)?bV:a7)}if(b5!==aB){if(b5===null){bG.removeAttr(b4,b1);return}else{if(e&&"set" in e&&b2&&(b0=e.set(b4,b5,b1))!==aB){return b0}else{b4.setAttribute(b1,b5+"");return b5}}}else{if(e&&"get" in e&&b2&&(b0=e.get(b4,b1))!==null){return b0}else{b0=b4.getAttribute(b1);return b0===null?aB:b0}}},removeAttr:function(b1,b3){var b2,b4,bZ,e,b0=0;if(b3&&b1.nodeType===1){b4=b3.split(aV);for(;b0=0)}}})});var bE=/^(?:textarea|input|select)$/i,br=/^([^\.]*|)(?:\.(.+)|)$/,ba=/(?:^|\s)hover(\.\S+|)\b/,a3=/^key/,bK=/^(?:mouse|contextmenu)|click/,by=/^(?:focusinfocus|focusoutblur)$/,aq=function(e){return bG.event.special.hover?e:e.replace(ba,"mouseenter$1 mouseleave$1")};bG.event={add:function(b1,b5,cc,b3,b2){var b6,b4,cd,cb,ca,b8,e,b9,bZ,b0,b7;if(b1.nodeType===3||b1.nodeType===8||!b5||!cc||!(b6=bG._data(b1))){return}if(cc.handler){bZ=cc;cc=bZ.handler;b2=bZ.selector}if(!cc.guid){cc.guid=bG.guid++}cd=b6.events;if(!cd){b6.events=cd={}}b4=b6.handle;if(!b4){b6.handle=b4=function(ce){return typeof bG!=="undefined"&&(!ce||bG.event.triggered!==ce.type)?bG.event.dispatch.apply(b4.elem,arguments):aB};b4.elem=b1}b5=bG.trim(aq(b5)).split(" ");for(cb=0;cb=0){ca=ca.slice(0,-1);b1=true}if(ca.indexOf(".")>=0){b0=ca.split(".");ca=b0.shift();b0.sort()}if((!b4||bG.event.customEvent[ca])&&!bG.event.global[ca]){return}bZ=typeof bZ==="object"?bZ[bG.expando]?bZ:new bG.Event(ca,bZ):new bG.Event(ca);bZ.type=ca;bZ.isTrigger=true;bZ.exclusive=b1;bZ.namespace=b0.join(".");bZ.namespace_re=bZ.namespace?new RegExp("(^|\\.)"+b0.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b2=ca.indexOf(":")<0?"on"+ca:"";if(!b4){e=bG.cache;for(b7 in e){if(e[b7].events&&e[b7].events[ca]){bG.event.trigger(bZ,b6,e[b7].handle.elem,true)}}return}bZ.result=aB;if(!bZ.target){bZ.target=b4}b6=b6!=null?bG.makeArray(b6):[];b6.unshift(bZ);b9=bG.event.special[ca]||{};if(b9.trigger&&b9.trigger.apply(b4,b6)===false){return}b5=[[b4,b9.bindType||ca]];if(!cd&&!b9.noBubble&&!bG.isWindow(b4)){cc=b9.delegateType||ca;cb=by.test(cc+ca)?b4:b4.parentNode;for(b3=b4;cb;cb=cb.parentNode){b5.push([cb,cc]);b3=cb}if(b3===(b4.ownerDocument||o)){b5.push([b3.defaultView||b3.parentWindow||a2,cc])}}for(b7=0;b7=0:bG.find(b1,this,null,[ce]).length}if(b7[b1]){b6.push(cc)}}if(b6.length){cb.push({elem:ce,matches:b6})}}}}if(b2.length>b3){cb.push({elem:this,matches:b2.slice(b3)})}for(b5=0;b50?this.on(e,null,b1,b0):this.trigger(e)};if(a3.test(e)){bG.event.fixHooks[e]=bG.event.keyHooks}if(bK.test(e)){bG.event.fixHooks[e]=bG.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function(cS,ch){var cX,ca,cL,b0,cm,cA,cd,cg,cc,cJ,b9=true,cu="undefined",cZ=("sizcache"+Math.random()).replace(".",""),b4=String,b8=cS.document,cb=b8.documentElement,cr=0,cf=0,cE=[].pop,cW=[].push,cl=[].slice,co=[].indexOf||function(c8){var c7=0,e=this.length;for(;c7cL.cacheLength){delete e[c7.shift()]}return(e[c8]=c9)},e)},cU=c5(),cV=c5(),cn=c5(),cy="[\\x20\\t\\r\\n\\f]",ck="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",ci=ck.replace("w","w#"),c4="([*^$|!~]?=)",cP="\\["+cy+"*("+ck+")"+cy+"*(?:"+c4+cy+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+ci+")|)|)"+cy+"*\\]",c6=":("+ck+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+cP+")|[^:]|\\\\.)*|.*))\\)|)",cz=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cy+"*((?:-\\d)?\\d*)"+cy+"*\\)|)(?=[^-]|$)",cT=new RegExp("^"+cy+"+|((?:^|[^\\\\])(?:\\\\.)*)"+cy+"+$","g"),b5=new RegExp("^"+cy+"*,"+cy+"*"),cH=new RegExp("^"+cy+"*([\\x20\\t\\r\\n\\f>+~])"+cy+"*"),cM=new RegExp(c6),cO=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,cD=/^:not/,cR=/[\x20\t\r\n\f]*[+~]/,c0=/:not\($/,cs=/h\d/i,cN=/input|select|textarea|button/i,ct=/\\(?!\\)/g,cG={ID:new RegExp("^#("+ck+")"),CLASS:new RegExp("^\\.("+ck+")"),NAME:new RegExp("^\\[name=['\"]?("+ck+")['\"]?\\]"),TAG:new RegExp("^("+ck.replace("w","w*")+")"),ATTR:new RegExp("^"+cP),PSEUDO:new RegExp("^"+c6),POS:new RegExp(cz,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+cy+"*(even|odd|(([+-]|)(\\d*)n|)"+cy+"*(?:([+-]|)"+cy+"*(\\d+)|))"+cy+"*\\)|)","i"),needsContext:new RegExp("^"+cy+"*[>+~]|"+cz,"i")},cK=function(c7){var c9=b8.createElement("div");try{return c7(c9)}catch(c8){return false}finally{c9=null}},b7=cK(function(e){e.appendChild(b8.createComment(""));return !e.getElementsByTagName("*").length}),cC=cK(function(e){e.innerHTML="";return e.firstChild&&typeof e.firstChild.getAttribute!==cu&&e.firstChild.getAttribute("href")==="#"}),cq=cK(function(c7){c7.innerHTML="";var e=typeof c7.lastChild.getAttribute("multiple");return e!=="boolean"&&e!=="string"}),cB=cK(function(e){e.innerHTML="";if(!e.getElementsByClassName||!e.getElementsByClassName("e").length){return false}e.lastChild.className="e";return e.getElementsByClassName("e").length===2}),bZ=cK(function(c7){c7.id=cZ+0;c7.innerHTML="
        ";cb.insertBefore(c7,cb.firstChild);var e=b8.getElementsByName&&b8.getElementsByName(cZ).length===2+b8.getElementsByName(cZ+0).length;ca=!b8.getElementById(cZ);cb.removeChild(c7);return e});try{cl.call(cb.childNodes,0)[0].nodeType}catch(c3){cl=function(c7){var c8,e=[];for(;(c8=this[c7]);c7++){e.push(c8)}return e}}function cQ(c9,e,db,de){db=db||[];e=e||b8;var dc,c7,dd,c8,da=e.nodeType;if(!c9||typeof c9!=="string"){return db}if(da!==1&&da!==9){return[]}dd=cm(e);if(!dd&&!de){if((dc=cO.exec(c9))){if((c8=dc[1])){if(da===9){c7=e.getElementById(c8);if(c7&&c7.parentNode){if(c7.id===c8){db.push(c7);return db}}else{return db}}else{if(e.ownerDocument&&(c7=e.ownerDocument.getElementById(c8))&&cA(e,c7)&&c7.id===c8){db.push(c7);return db}}}else{if(dc[2]){cW.apply(db,cl.call(e.getElementsByTagName(c9),0));return db}else{if((c8=dc[3])&&cB&&e.getElementsByClassName){cW.apply(db,cl.call(e.getElementsByClassName(c8),0));return db}}}}}return cY(c9.replace(cT,"$1"),e,db,de,dd)}cQ.matches=function(c7,e){return cQ(c7,null,null,e)};cQ.matchesSelector=function(e,c7){return cQ(c7,null,null,[e]).length>0};function cI(e){return function(c8){var c7=c8.nodeName.toLowerCase();return c7==="input"&&c8.type===e}}function b3(e){return function(c8){var c7=c8.nodeName.toLowerCase();return(c7==="input"||c7==="button")&&c8.type===e}}function cF(e){return c1(function(c7){c7=+c7;return c1(function(c8,dc){var da,c9=e([],c8.length,c7),db=c9.length;while(db--){if(c8[(da=c9[db])]){c8[da]=!(dc[da]=c8[da])}}})})}b0=cQ.getText=function(da){var c9,c7="",c8=0,e=da.nodeType;if(e){if(e===1||e===9||e===11){if(typeof da.textContent==="string"){return da.textContent}else{for(da=da.firstChild;da;da=da.nextSibling){c7+=b0(da)}}}else{if(e===3||e===4){return da.nodeValue}}}else{for(;(c9=da[c8]);c8++){c7+=b0(c9)}}return c7};cm=cQ.isXML=function(e){var c7=e&&(e.ownerDocument||e).documentElement;return c7?c7.nodeName!=="HTML":false};cA=cQ.contains=cb.contains?function(c7,e){var c9=c7.nodeType===9?c7.documentElement:c7,c8=e&&e.parentNode;return c7===c8||!!(c8&&c8.nodeType===1&&c9.contains&&c9.contains(c8))}:cb.compareDocumentPosition?function(c7,e){return e&&!!(c7.compareDocumentPosition(e)&16)}:function(c7,e){while((e=e.parentNode)){if(e===c7){return true}}return false};cQ.attr=function(c8,c7){var c9,e=cm(c8);if(!e){c7=c7.toLowerCase()}if((c9=cL.attrHandle[c7])){return c9(c8)}if(e||cq){return c8.getAttribute(c7)}c9=c8.getAttributeNode(c7);return c9?typeof c8[c7]==="boolean"?c8[c7]?c7:null:c9.specified?c9.value:null:null};cL=cQ.selectors={cacheLength:50,createPseudo:c1,match:cG,attrHandle:cC?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:ca?function(c9,c8,c7){if(typeof c8.getElementById!==cu&&!c7){var e=c8.getElementById(c9);return e&&e.parentNode?[e]:[]}}:function(c9,c8,c7){if(typeof c8.getElementById!==cu&&!c7){var e=c8.getElementById(c9);return e?e.id===c9||typeof e.getAttributeNode!==cu&&e.getAttributeNode("id").value===c9?[e]:ch:[]}},TAG:b7?function(e,c7){if(typeof c7.getElementsByTagName!==cu){return c7.getElementsByTagName(e)}}:function(e,da){var c9=da.getElementsByTagName(e);if(e==="*"){var db,c8=[],c7=0;for(;(db=c9[c7]);c7++){if(db.nodeType===1){c8.push(db)}}return c8}return c9},NAME:bZ&&function(e,c7){if(typeof c7.getElementsByName!==cu){return c7.getElementsByName(name)}},CLASS:cB&&function(c8,c7,e){if(typeof c7.getElementsByClassName!==cu&&!e){return c7.getElementsByClassName(c8)}}},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(ct,"");e[3]=(e[4]||e[5]||"").replace(ct,"");if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1]==="nth"){if(!e[2]){cQ.error(e[0])}e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd"));e[4]=+((e[6]+e[7])||e[2]==="odd")}else{if(e[2]){cQ.error(e[0])}}return e},PSEUDO:function(c7){var c8,e;if(cG.CHILD.test(c7[0])){return null}if(c7[3]){c7[2]=c7[3]}else{if((c8=c7[4])){if(cM.test(c8)&&(e=b1(c8,true))&&(e=c8.indexOf(")",c8.length-e)-c8.length)){c8=c8.slice(0,e);c7[0]=c7[0].slice(0,e)}c7[2]=c8}}return c7.slice(0,3)}},filter:{ID:ca?function(e){e=e.replace(ct,"");return function(c7){return c7.getAttribute("id")===e}}:function(e){e=e.replace(ct,"");return function(c8){var c7=typeof c8.getAttributeNode!==cu&&c8.getAttributeNode("id");return c7&&c7.value===e}},TAG:function(e){if(e==="*"){return function(){return true}}e=e.replace(ct,"").toLowerCase();return function(c7){return c7.nodeName&&c7.nodeName.toLowerCase()===e}},CLASS:function(e){var c7=cU[cZ][e];if(!c7){c7=cU(e,new RegExp("(^|"+cy+")"+e+"("+cy+"|$)"))}return function(c8){return c7.test(c8.className||(typeof c8.getAttribute!==cu&&c8.getAttribute("class"))||"")}},ATTR:function(c8,c7,e){return function(db,da){var c9=cQ.attr(db,c8);if(c9==null){return c7==="!="}if(!c7){return true}c9+="";return c7==="="?c9===e:c7==="!="?c9!==e:c7==="^="?e&&c9.indexOf(e)===0:c7==="*="?e&&c9.indexOf(e)>-1:c7==="$="?e&&c9.substr(c9.length-e.length)===e:c7==="~="?(" "+c9+" ").indexOf(e)>-1:c7==="|="?c9===e||c9.substr(0,e.length+1)===e+"-":false}},CHILD:function(e,c8,c9,c7){if(e==="nth"){return function(dc){var db,dd,da=dc.parentNode;if(c9===1&&c7===0){return true}if(da){dd=0;for(db=da.firstChild;db;db=db.nextSibling){if(db.nodeType===1){dd++;if(dc===db){break}}}}dd-=c7;return dd===c9||(dd%c9===0&&dd/c9>=0)}}return function(db){var da=db;switch(e){case"only":case"first":while((da=da.previousSibling)){if(da.nodeType===1){return false}}if(e==="first"){return true}da=db;case"last":while((da=da.nextSibling)){if(da.nodeType===1){return false}}return true}}},PSEUDO:function(c9,c8){var e,c7=cL.pseudos[c9]||cL.setFilters[c9.toLowerCase()]||cQ.error("unsupported pseudo: "+c9);if(c7[cZ]){return c7(c8)}if(c7.length>1){e=[c9,c9,"",c8];return cL.setFilters.hasOwnProperty(c9.toLowerCase())?c1(function(dc,de){var db,da=c7(dc,c8),dd=da.length;while(dd--){db=co.call(dc,da[dd]);dc[db]=!(de[db]=da[dd])}}):function(da){return c7(da,0,e)}}return c7}},pseudos:{not:c1(function(e){var c7=[],c8=[],c9=cd(e.replace(cT,"$1"));return c9[cZ]?c1(function(db,dg,de,dc){var df,da=c9(db,null,dc,[]),dd=db.length;while(dd--){if((df=da[dd])){db[dd]=!(dg[dd]=df)}}}):function(dc,db,da){c7[0]=dc;c9(c7,null,da,c8);return !c8.pop()}}),has:c1(function(e){return function(c7){return cQ(e,c7).length>0}}),contains:c1(function(e){return function(c7){return(c7.textContent||c7.innerText||b0(c7)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var c7=e.nodeName.toLowerCase();return(c7==="input"&&!!e.checked)||(c7==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !cL.pseudos.empty(e)},empty:function(c7){var e;c7=c7.firstChild;while(c7){if(c7.nodeName>"@"||(e=c7.nodeType)===3||e===4){return false}c7=c7.nextSibling}return true},header:function(e){return cs.test(e.nodeName)},text:function(c8){var c7,e;return c8.nodeName.toLowerCase()==="input"&&(c7=c8.type)==="text"&&((e=c8.getAttribute("type"))==null||e.toLowerCase()===c7)},radio:cI("radio"),checkbox:cI("checkbox"),file:cI("file"),password:cI("password"),image:cI("image"),submit:b3("submit"),reset:b3("reset"),button:function(c7){var e=c7.nodeName.toLowerCase();return e==="input"&&c7.type==="button"||e==="button"},input:function(e){return cN.test(e.nodeName)},focus:function(e){var c7=e.ownerDocument;return e===c7.activeElement&&(!c7.hasFocus||c7.hasFocus())&&!!(e.type||e.href)},active:function(e){return e===e.ownerDocument.activeElement},first:cF(function(e,c8,c7){return[0]}),last:cF(function(e,c8,c7){return[c8-1]}),eq:cF(function(e,c8,c7){return[c7<0?c7+c8:c7]}),even:cF(function(e,c9,c8){for(var c7=0;c7=0;){e.push(c7)}return e}),gt:cF(function(e,c9,c8){for(var c7=c8<0?c8+c9:c8;++c71?function(da,c9,c7){var c8=e.length;while(c8--){if(!e[c8](da,c9,c7)){return false}}return true}:e[0]}function cv(e,c7,c8,c9,dc){var da,df=[],db=0,dd=e.length,de=c7!=null;for(;db-1},dg,true),e=[function(dj,di,dh){return(!df&&(dh||di!==cJ))||((c7=di).nodeType?dd(dj,di,dh):de(dj,di,dh))}];for(;c91&&ce(e),c9>1&&dc.slice(0,c9-1).join("").replace(cT,"$1"),da,c90,da=c9.length>0,c7=function(dk,de,dj,di,dr){var df,dg,dl,dq=[],dp=0,dh="0",db=dk&&[],dm=dr!=null,dn=cJ,dd=dk||da&&cL.find.TAG("*",dr&&de.parentNode||de),dc=(cr+=dn==null?1:Math.E);if(dm){cJ=de!==b8&&de;cX=c7.el}for(;(df=dd[dh])!=null;dh++){if(da&&df){for(dg=0;(dl=c9[dg]);dg++){if(dl(df,de,dj)){di.push(df);break}}if(dm){cr=dc;cX=++c7.el}}if(e){if((df=!dl&&df)){dp--}if(dk){db.push(df)}}}dp+=dh;if(e&&dh!==dp){for(dg=0;(dl=c8[dg]);dg++){dl(db,dq,de,dj)}if(dk){if(dp>0){while(dh--){if(!(db[dh]||dq[dh])){dq[dh]=cE.call(di)}}}dq=cv(dq)}cW.apply(di,dq);if(dm&&!dk&&dq.length>0&&(dp+c8.length)>1){cQ.uniqueSort(di)}}if(dm){cr=dc;cJ=dn}return db};c7.el=0;return e?c1(c7):c7}cd=cQ.compile=function(e,db){var c8,c7=[],da=[],c9=cn[cZ][e];if(!c9){if(!db){db=b1(e)}c8=db.length;while(c8--){c9=cx(db[c8]);if(c9[cZ]){c7.push(c9)}else{da.push(c9)}}c9=cn(e,b6(da,c7))}return c9};function cp(c7,db,da,c8){var c9=0,e=db.length;for(;c92&&(c7=dh[0]).type==="ID"&&e.nodeType===9&&!dd&&cL.relative[dh[1].type]){e=cL.find.ID(c7.matches[0].replace(ct,""),e,dd)[0];if(!e){return da}c8=c8.slice(dh.shift().length)}for(db=cG.POS.test(c8)?-1:dh.length-1;db>=0;db--){c7=dh[db];if(cL.relative[(dg=c7.type)]){break}if((df=cL.find[dg])){if((de=df(c7.matches[0].replace(ct,""),cR.test(dh[0].type)&&e.parentNode||e,dd))){dh.splice(db,1);c8=de.length&&dh.join("");if(!c8){cW.apply(da,cl.call(de,0));return da}break}}}}}cd(c8,dc)(de,e,dd,da,cR.test(c8));return da}if(b8.querySelectorAll){(function(){var db,dc=cY,da=/'|\\/g,c8=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,c7=[":focus"],e=[":active",":focus"],c9=cb.matchesSelector||cb.mozMatchesSelector||cb.webkitMatchesSelector||cb.oMatchesSelector||cb.msMatchesSelector;cK(function(dd){dd.innerHTML="";if(!dd.querySelectorAll("[selected]").length){c7.push("\\["+cy+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)")}if(!dd.querySelectorAll(":checked").length){c7.push(":checked")}});cK(function(dd){dd.innerHTML="

        ";if(dd.querySelectorAll("[test^='']").length){c7.push("[*^$]="+cy+"*(?:\"\"|'')")}dd.innerHTML="";if(!dd.querySelectorAll(":enabled").length){c7.push(":enabled",":disabled")}});c7=new RegExp(c7.join("|"));cY=function(dj,de,dl,dp,dn){if(!dp&&!dn&&(!c7||!c7.test(dj))){var dh,dm,dg=true,dd=cZ,df=de,dk=de.nodeType===9&&dj;if(de.nodeType===1&&de.nodeName.toLowerCase()!=="object"){dh=b1(dj);if((dg=de.getAttribute("id"))){dd=dg.replace(da,"\\$&")}else{de.setAttribute("id",dd)}dd="[id='"+dd+"'] ";dm=dh.length;while(dm--){dh[dm]=dd+dh[dm].join("")}df=cR.test(dj)&&de.parentNode||de;dk=dh.join(",")}if(dk){try{cW.apply(dl,cl.call(df.querySelectorAll(dk),0));return dl}catch(di){}finally{if(!dg){de.removeAttribute("id")}}}}return dc(dj,de,dl,dp,dn)};if(c9){cK(function(de){db=c9.call(de,"div");try{c9.call(de,"[test!='']:sizzle");e.push("!=",c6)}catch(dd){}});e=new RegExp(e.join("|"));cQ.matchesSelector=function(de,dg){dg=dg.replace(c8,"='$1']");if(!cm(de)&&!e.test(dg)&&(!c7||!c7.test(dg))){try{var dd=c9.call(de,dg);if(dd||db||de.document&&de.document.nodeType!==11){return dd}}catch(df){}}return cQ(dg,null,null,[de]).length>0}}})()}cL.pseudos.nth=cL.pseudos.eq;function cj(){}cL.filters=cj.prototype=cL.pseudos;cL.setFilters=new cj();cQ.attr=bG.attr;bG.find=cQ;bG.expr=cQ.selectors;bG.expr[":"]=bG.expr.pseudos;bG.unique=cQ.uniqueSort;bG.text=cQ.getText;bG.isXMLDoc=cQ.isXML;bG.contains=cQ.contains})(a2);var ag=/Until$/,bq=/^(?:parents|prev(?:Until|All))/,al=/^.[^:#\[\.,]*$/,y=bG.expr.match.needsContext,bu={children:true,contents:true,next:true,prev:true};bG.fn.extend({find:function(e){var b2,bZ,b4,b5,b3,b1,b0=this;if(typeof e!=="string"){return bG(e).filter(function(){for(b2=0,bZ=b0.length;b20){for(b5=b4;b5=0:bG.filter(e,this).length>0:this.filter(e).length>0)},closest:function(b2,b1){var b3,b0=0,e=this.length,bZ=[],b4=y.test(b2)||typeof b2!=="string"?bG(b2,b1||this.context):0;for(;b0-1:bG.find.matchesSelector(b3,b2)){bZ.push(b3);break}b3=b3.parentNode}}bZ=bZ.length>1?bG.unique(bZ):bZ;return this.pushStack(bZ,"closest",b2)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return bG.inArray(this[0],bG(e))}return bG.inArray(e.jquery?e[0]:e,this)},add:function(e,bZ){var b1=typeof e==="string"?bG(e,bZ):bG.makeArray(e&&e.nodeType?[e]:e),b0=bG.merge(this.get(),b1);return this.pushStack(aR(b1[0])||aR(b0[0])?b0:bG.unique(b0))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});bG.fn.andSelf=bG.fn.addBack;function aR(e){return !e||!e.parentNode||e.parentNode.nodeType===11}function aY(bZ,e){do{bZ=bZ[e]}while(bZ&&bZ.nodeType!==1);return bZ}bG.each({parent:function(bZ){var e=bZ.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bG.dir(e,"parentNode")},parentsUntil:function(bZ,e,b0){return bG.dir(bZ,"parentNode",b0)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bG.dir(e,"nextSibling")},prevAll:function(e){return bG.dir(e,"previousSibling")},nextUntil:function(bZ,e,b0){return bG.dir(bZ,"nextSibling",b0)},prevUntil:function(bZ,e,b0){return bG.dir(bZ,"previousSibling",b0)},siblings:function(e){return bG.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bG.sibling(e.firstChild)},contents:function(e){return bG.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bG.merge([],e.childNodes)}},function(e,bZ){bG.fn[e]=function(b2,b0){var b1=bG.map(this,bZ,b2);if(!ag.test(e)){b0=b2}if(b0&&typeof b0==="string"){b1=bG.filter(b0,b1)}b1=this.length>1&&!bu[e]?bG.unique(b1):b1;if(this.length>1&&bq.test(e)){b1=b1.reverse()}return this.pushStack(b1,e,a4.call(arguments).join(","))}});bG.extend({filter:function(b0,e,bZ){if(bZ){b0=":not("+b0+")"}return e.length===1?bG.find.matchesSelector(e[0],b0)?[e[0]]:[]:bG.find.matches(b0,e)},dir:function(b0,bZ,b2){var e=[],b1=b0[bZ];while(b1&&b1.nodeType!==9&&(b2===aB||b1.nodeType!==1||!bG(b1).is(b2))){if(b1.nodeType===1){e.push(b1)}b1=b1[bZ]}return e},sibling:function(b0,bZ){var e=[];for(;b0;b0=b0.nextSibling){if(b0.nodeType===1&&b0!==bZ){e.push(b0)}}return e}});function aM(b1,b0,e){b0=b0||0;if(bG.isFunction(b0)){return bG.grep(b1,function(b3,b2){var b4=!!b0.call(b3,b2,b3);return b4===e})}else{if(b0.nodeType){return bG.grep(b1,function(b3,b2){return(b3===b0)===e})}else{if(typeof b0==="string"){var bZ=bG.grep(b1,function(b2){return b2.nodeType===1});if(al.test(b0)){return bG.filter(b0,bZ,!e)}else{b0=bG.filter(b0,bZ)}}}}return bG.grep(b1,function(b3,b2){return(bG.inArray(b3,b0)>=0)===e})}function A(e){var b0=c.split("|"),bZ=e.createDocumentFragment();if(bZ.createElement){while(b0.length){bZ.createElement(b0.pop())}}return bZ}var c="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",av=/ jQuery\d+="(?:null|\d+)"/g,bY=/^\s+/,ay=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,p=/<([\w:]+)/,bT=/]","i"),aE=/^(?:checkbox|radio)$/,bR=/checked\s*(?:[^=]|=\s*.checked.)/i,bw=/\/(java|ecma)script/i,aH=/^\s*\s*$/g,T={option:[1,""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]},aQ=A(o),l=aQ.appendChild(o.createElement("div"));T.optgroup=T.option;T.tbody=T.tfoot=T.colgroup=T.caption=T.thead;T.th=T.td;if(!bG.support.htmlSerialize){T._default=[1,"X
        ","
        "]}bG.fn.extend({text:function(e){return bG.access(this,function(bZ){return bZ===aB?bG.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(bZ))},null,e,arguments.length)},wrapAll:function(e){if(bG.isFunction(e)){return this.each(function(b0){bG(this).wrapAll(e.call(this,b0))})}if(this[0]){var bZ=bG(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bZ.insertBefore(this[0])}bZ.map(function(){var b0=this;while(b0.firstChild&&b0.firstChild.nodeType===1){b0=b0.firstChild}return b0}).append(this)}return this},wrapInner:function(e){if(bG.isFunction(e)){return this.each(function(bZ){bG(this).wrapInner(e.call(this,bZ))})}return this.each(function(){var bZ=bG(this),b0=bZ.contents();if(b0.length){b0.wrapAll(e)}else{bZ.append(e)}})},wrap:function(e){var bZ=bG.isFunction(e);return this.each(function(b0){bG(this).wrapAll(bZ?e.call(this,b0):e)})},unwrap:function(){return this.parent().each(function(){if(!bG.nodeName(this,"body")){bG(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1||this.nodeType===11){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1||this.nodeType===11){this.insertBefore(e,this.firstChild)}})},before:function(){if(!aR(this[0])){return this.domManip(arguments,false,function(bZ){this.parentNode.insertBefore(bZ,this)})}if(arguments.length){var e=bG.clean(arguments);return this.pushStack(bG.merge(e,this),"before",this.selector)}},after:function(){if(!aR(this[0])){return this.domManip(arguments,false,function(bZ){this.parentNode.insertBefore(bZ,this.nextSibling)})}if(arguments.length){var e=bG.clean(arguments);return this.pushStack(bG.merge(this,e),"after",this.selector)}},remove:function(e,b1){var b0,bZ=0;for(;(b0=this[bZ])!=null;bZ++){if(!e||bG.filter(e,[b0]).length){if(!b1&&b0.nodeType===1){bG.cleanData(b0.getElementsByTagName("*"));bG.cleanData([b0])}if(b0.parentNode){b0.parentNode.removeChild(b0)}}}return this},empty:function(){var bZ,e=0;for(;(bZ=this[e])!=null;e++){if(bZ.nodeType===1){bG.cleanData(bZ.getElementsByTagName("*"))}while(bZ.firstChild){bZ.removeChild(bZ.firstChild)}}return this},clone:function(bZ,e){bZ=bZ==null?false:bZ;e=e==null?bZ:e;return this.map(function(){return bG.clone(this,bZ,e)})},html:function(e){return bG.access(this,function(b2){var b1=this[0]||{},b0=0,bZ=this.length;if(b2===aB){return b1.nodeType===1?b1.innerHTML.replace(av,""):aB}if(typeof b2==="string"&&!aj.test(b2)&&(bG.support.htmlSerialize||!K.test(b2))&&(bG.support.leadingWhitespace||!bY.test(b2))&&!T[(p.exec(b2)||["",""])[1].toLowerCase()]){b2=b2.replace(ay,"<$1>");try{for(;b01&&typeof b5==="string"&&bR.test(b5)){return this.each(function(){bG(this).domManip(b4,b8,b7)})}if(bG.isFunction(b5)){return this.each(function(ca){var b9=bG(this);b4[0]=b5.call(this,ca,b8?b9.html():aB);b9.domManip(b4,b8,b7)})}if(this[0]){b0=bG.buildFragment(b4,this,bZ);b3=b0.fragment;b2=b3.firstChild;if(b3.childNodes.length===1){b3=b2}if(b2){b8=b8&&bG.nodeName(b2,"tr");for(b6=b0.cacheable||e-1;b10?this.clone(true):this).get();bG(b6[b4])[bZ](b2);b3=b3.concat(b2)}return this.pushStack(b3,e,b6.selector)}}});function m(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function bS(e){if(aE.test(e.type)){e.defaultChecked=e.checked}}bG.extend({clone:function(b2,b4,b0){var e,bZ,b1,b3;if(bG.support.html5Clone||bG.isXMLDoc(b2)||!K.test("<"+b2.nodeName+">")){b3=b2.cloneNode(true)}else{l.innerHTML=b2.outerHTML;l.removeChild(b3=l.firstChild)}if((!bG.support.noCloneEvent||!bG.support.noCloneChecked)&&(b2.nodeType===1||b2.nodeType===11)&&!bG.isXMLDoc(b2)){F(b2,b3);e=m(b2);bZ=m(b3);for(b1=0;e[b1];++b1){if(bZ[b1]){F(e[b1],bZ[b1])}}}if(b4){ao(b2,b3);if(b0){e=m(b2);bZ=m(b3);for(b1=0;e[b1];++b1){ao(e[b1],bZ[b1])}}}e=bZ=null;return b3},clean:function(cb,b0,e,b1){var b8,b7,ca,cf,b4,ce,b5,b2,bZ,b9,cd,b6,b3=b0===o&&aQ,cc=[];if(!b0||typeof b0.createDocumentFragment==="undefined"){b0=o}for(b8=0;(ca=cb[b8])!=null;b8++){if(typeof ca==="number"){ca+=""}if(!ca){continue}if(typeof ca==="string"){if(!J.test(ca)){ca=b0.createTextNode(ca)}else{b3=b3||A(b0);b5=b0.createElement("div");b3.appendChild(b5);ca=ca.replace(ay,"<$1>");cf=(p.exec(ca)||["",""])[1].toLowerCase();b4=T[cf]||T._default;ce=b4[0];b5.innerHTML=b4[1]+ca+b4[2];while(ce--){b5=b5.lastChild}if(!bG.support.tbody){b2=bT.test(ca);bZ=cf==="table"&&!b2?b5.firstChild&&b5.firstChild.childNodes:b4[1]===""&&!b2?b5.childNodes:[];for(b7=bZ.length-1;b7>=0;--b7){if(bG.nodeName(bZ[b7],"tbody")&&!bZ[b7].childNodes.length){bZ[b7].parentNode.removeChild(bZ[b7])}}}if(!bG.support.leadingWhitespace&&bY.test(ca)){b5.insertBefore(b0.createTextNode(bY.exec(ca)[0]),b5.firstChild)}ca=b5.childNodes;b5.parentNode.removeChild(b5)}}if(ca.nodeType){cc.push(ca)}else{bG.merge(cc,ca)}}if(b5){ca=b5=b3=null}if(!bG.support.appendChecked){for(b8=0;(ca=cc[b8])!=null;b8++){if(bG.nodeName(ca,"input")){bS(ca)}else{if(typeof ca.getElementsByTagName!=="undefined"){bG.grep(ca.getElementsByTagName("input"),bS)}}}}if(e){cd=function(cg){if(!cg.type||bw.test(cg.type)){return b1?b1.push(cg.parentNode?cg.parentNode.removeChild(cg):cg):e.appendChild(cg)}};for(b8=0;(ca=cc[b8])!=null;b8++){if(!(bG.nodeName(ca,"script")&&cd(ca))){e.appendChild(ca);if(typeof ca.getElementsByTagName!=="undefined"){b6=bG.grep(bG.merge([],ca.getElementsByTagName("script")),cd);cc.splice.apply(cc,[b8+1,0].concat(b6));b8+=b6.length}}}}return cc},cleanData:function(bZ,b7){var b2,b0,b1,b6,b3=0,b8=bG.expando,e=bG.cache,b4=bG.support.deleteExpando,b5=bG.event.special;for(;(b1=bZ[b3])!=null;b3++){if(b7||bG.acceptData(b1)){b0=b1[b8];b2=b0&&e[b0];if(b2){if(b2.events){for(b6 in b2.events){if(b5[b6]){bG.event.remove(b1,b6)}else{bG.removeEvent(b1,b6,b2.handle)}}}if(e[b0]){delete e[b0];if(b4){delete b1[b8]}else{if(b1.removeAttribute){b1.removeAttribute(b8)}else{b1[b8]=null}}bG.deletedIds.push(b0)}}}}}});(function(){var e,bZ;bG.uaMatch=function(b1){b1=b1.toLowerCase();var b0=/(chrome)[ \/]([\w.]+)/.exec(b1)||/(webkit)[ \/]([\w.]+)/.exec(b1)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(b1)||/(msie) ([\w.]+)/.exec(b1)||b1.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}};e=bG.uaMatch(d.userAgent);bZ={};if(e.browser){bZ[e.browser]=true;bZ.version=e.version}if(bZ.chrome){bZ.webkit=true}else{if(bZ.webkit){bZ.safari=true}}bG.browser=bZ;bG.sub=function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bG.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bG&&!(b4 instanceof b0)){b4=b0(b4)}return bG.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(o);return b0}})();var E,az,aW,be=/alpha\([^)]*\)/i,aS=/opacity=([^)]*)/,bk=/^(top|right|bottom|left)$/,G=/^(none|table(?!-c[ea]).+)/,aZ=/^margin/,a8=new RegExp("^("+bx+")(.*)$","i"),W=new RegExp("^("+bx+")(?!px)[a-z%]+$","i"),S=new RegExp("^([-+])=("+bx+")","i"),bh={},a9={position:"absolute",visibility:"hidden",display:"block"},bA={letterSpacing:0,fontWeight:400},bQ=["Top","Right","Bottom","Left"],ar=["Webkit","O","Moz","ms"],aJ=bG.fn.toggle;function b(b1,bZ){if(bZ in b1){return bZ}var b2=bZ.charAt(0).toUpperCase()+bZ.slice(1),e=bZ,b0=ar.length;while(b0--){bZ=ar[b0]+b2;if(bZ in b1){return bZ}}return e}function Q(bZ,e){bZ=e||bZ;return bG.css(bZ,"display")==="none"||!bG.contains(bZ.ownerDocument,bZ)}function s(b3,e){var b2,b4,bZ=[],b0=0,b1=b3.length;for(;b01)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(b0,bZ){var e=typeof b0==="boolean";if(bG.isFunction(b0)&&bG.isFunction(bZ)){return aJ.apply(this,arguments)}return this.each(function(){if(e?b0:Q(this)){bG(this).show()}else{bG(this).hide()}})}});bG.extend({cssHooks:{opacity:{get:function(b0,bZ){if(bZ){var e=E(b0,"opacity");return e===""?"1":e}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":bG.support.cssFloat?"cssFloat":"styleFloat"},style:function(b1,b0,b7,b2){if(!b1||b1.nodeType===3||b1.nodeType===8||!b1.style){return}var b5,b6,b8,b3=bG.camelCase(b0),bZ=b1.style;b0=bG.cssProps[b3]||(bG.cssProps[b3]=b(bZ,b3));b8=bG.cssHooks[b0]||bG.cssHooks[b3];if(b7!==aB){b6=typeof b7;if(b6==="string"&&(b5=S.exec(b7))){b7=(b5[1]+1)*b5[2]+parseFloat(bG.css(b1,b0));b6="number"}if(b7==null||b6==="number"&&isNaN(b7)){return}if(b6==="number"&&!bG.cssNumber[b3]){b7+="px"}if(!b8||!("set" in b8)||(b7=b8.set(b1,b7,b2))!==aB){try{bZ[b0]=b7}catch(b4){}}}else{if(b8&&"get" in b8&&(b5=b8.get(b1,false,b2))!==aB){return b5}return bZ[b0]}},css:function(b4,b2,b3,bZ){var b5,b1,e,b0=bG.camelCase(b2);b2=bG.cssProps[b0]||(bG.cssProps[b0]=b(b4.style,b0));e=bG.cssHooks[b2]||bG.cssHooks[b0];if(e&&"get" in e){b5=e.get(b4,true,bZ)}if(b5===aB){b5=E(b4,b2)}if(b5==="normal"&&b2 in bA){b5=bA[b2]}if(b3||bZ!==aB){b1=parseFloat(b5);return b3||bG.isNumeric(b1)?b1||0:b5}return b5},swap:function(b2,b1,b3){var b0,bZ,e={};for(bZ in b1){e[bZ]=b2.style[bZ];b2.style[bZ]=b1[bZ]}b0=b3.call(b2);for(bZ in b1){b2.style[bZ]=e[bZ]}return b0}});if(a2.getComputedStyle){E=function(b5,bZ){var e,b2,b1,b4,b3=a2.getComputedStyle(b5,null),b0=b5.style;if(b3){e=b3[bZ];if(e===""&&!bG.contains(b5.ownerDocument,b5)){e=bG.style(b5,bZ)}if(W.test(e)&&aZ.test(bZ)){b2=b0.width;b1=b0.minWidth;b4=b0.maxWidth;b0.minWidth=b0.maxWidth=b0.width=e;e=b3.width;b0.width=b2;b0.minWidth=b1;b0.maxWidth=b4}}return e}}else{if(o.documentElement.currentStyle){E=function(b2,b0){var b3,e,bZ=b2.currentStyle&&b2.currentStyle[b0],b1=b2.style;if(bZ==null&&b1&&b1[b0]){bZ=b1[b0]}if(W.test(bZ)&&!bk.test(b0)){b3=b1.left;e=b2.runtimeStyle&&b2.runtimeStyle.left;if(e){b2.runtimeStyle.left=b2.currentStyle.left}b1.left=b0==="fontSize"?"1em":bZ;bZ=b1.pixelLeft+"px";b1.left=b3;if(e){b2.runtimeStyle.left=e}}return bZ===""?"auto":bZ}}}function aG(e,b0,b1){var bZ=a8.exec(b0);return bZ?Math.max(0,bZ[1]-(b1||0))+(bZ[2]||"px"):b0}function at(b1,bZ,e,b3){var b0=e===(b3?"border":"content")?4:bZ==="width"?1:0,b2=0;for(;b0<4;b0+=2){if(e==="margin"){b2+=bG.css(b1,e+bQ[b0],true)}if(b3){if(e==="content"){b2-=parseFloat(E(b1,"padding"+bQ[b0]))||0}if(e!=="margin"){b2-=parseFloat(E(b1,"border"+bQ[b0]+"Width"))||0}}else{b2+=parseFloat(E(b1,"padding"+bQ[b0]))||0;if(e!=="padding"){b2+=parseFloat(E(b1,"border"+bQ[b0]+"Width"))||0}}}return b2}function u(b1,bZ,e){var b2=bZ==="width"?b1.offsetWidth:b1.offsetHeight,b0=true,b3=bG.support.boxSizing&&bG.css(b1,"boxSizing")==="border-box";if(b2<=0||b2==null){b2=E(b1,bZ);if(b2<0||b2==null){b2=b1.style[bZ]}if(W.test(b2)){return b2}b0=b3&&(bG.support.boxSizingReliable||b2===b1.style[bZ]);b2=parseFloat(b2)||0}return(b2+at(b1,bZ,e||(b3?"border":"content"),b0))+"px"}function bC(b0){if(bh[b0]){return bh[b0]}var e=bG("<"+b0+">").appendTo(o.body),bZ=e.css("display");e.remove();if(bZ==="none"||bZ===""){az=o.body.appendChild(az||bG.extend(o.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!aW||!az.createElement){aW=(az.contentWindow||az.contentDocument).document;aW.write("");aW.close()}e=aW.body.appendChild(aW.createElement(b0));bZ=E(e,"display");o.body.removeChild(az)}bh[b0]=bZ;return bZ}bG.each(["height","width"],function(bZ,e){bG.cssHooks[e]={get:function(b2,b1,b0){if(b1){if(b2.offsetWidth===0&&G.test(E(b2,"display"))){return bG.swap(b2,a9,function(){return u(b2,e,b0)})}else{return u(b2,e,b0)}}},set:function(b1,b2,b0){return aG(b1,b2,b0?at(b1,e,b0,bG.support.boxSizing&&bG.css(b1,"boxSizing")==="border-box"):0)}}});if(!bG.support.opacity){bG.cssHooks.opacity={get:function(bZ,e){return aS.test((e&&bZ.currentStyle?bZ.currentStyle.filter:bZ.style.filter)||"")?(0.01*parseFloat(RegExp.$1))+"":e?"1":""},set:function(b2,b3){var b1=b2.style,bZ=b2.currentStyle,e=bG.isNumeric(b3)?"alpha(opacity="+b3*100+")":"",b0=bZ&&bZ.filter||b1.filter||"";b1.zoom=1;if(b3>=1&&bG.trim(b0.replace(be,""))===""&&b1.removeAttribute){b1.removeAttribute("filter");if(bZ&&!bZ.filter){return}}b1.filter=be.test(b0)?b0.replace(be,e):b0+" "+e}}}bG(function(){if(!bG.support.reliableMarginRight){bG.cssHooks.marginRight={get:function(bZ,e){return bG.swap(bZ,{display:"inline-block"},function(){if(e){return E(bZ,"marginRight")}})}}}if(!bG.support.pixelPosition&&bG.fn.position){bG.each(["top","left"],function(e,bZ){bG.cssHooks[bZ]={get:function(b2,b1){if(b1){var b0=E(b2,bZ);return W.test(b0)?bG(b2).position()[bZ]+"px":b0}}}})}});if(bG.expr&&bG.expr.filters){bG.expr.filters.hidden=function(e){return(e.offsetWidth===0&&e.offsetHeight===0)||(!bG.support.reliableHiddenOffsets&&((e.style&&e.style.display)||E(e,"display"))==="none")};bG.expr.filters.visible=function(e){return !bG.expr.filters.hidden(e)}}bG.each({margin:"",padding:"",border:"Width"},function(e,bZ){bG.cssHooks[e+bZ]={expand:function(b2){var b1,b3=typeof b2==="string"?b2.split(" "):[b2],b0={};for(b1=0;b1<4;b1++){b0[e+bQ[b1]+bZ]=b3[b1]||b3[b1-2]||b3[0]}return b0}};if(!aZ.test(e)){bG.cssHooks[e+bZ].set=aG}});var bs=/%20/g,aP=/\[\]$/,U=/\r?\n/g,bz=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aD=/^(?:select|textarea)/i;bG.fn.extend({serialize:function(){return bG.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?bG.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||aD.test(this.nodeName)||bz.test(this.type))}).map(function(e,bZ){var b0=bG(this).val();return b0==null?null:bG.isArray(b0)?bG.map(b0,function(b2,b1){return{name:bZ.name,value:b2.replace(U,"\r\n")}}):{name:bZ.name,value:b0.replace(U,"\r\n")}}).get()}});bG.param=function(e,b0){var b1,bZ=[],b2=function(b3,b4){b4=bG.isFunction(b4)?b4():(b4==null?"":b4);bZ[bZ.length]=encodeURIComponent(b3)+"="+encodeURIComponent(b4)};if(b0===aB){b0=bG.ajaxSettings&&bG.ajaxSettings.traditional}if(bG.isArray(e)||(e.jquery&&!bG.isPlainObject(e))){bG.each(e,function(){b2(this.name,this.value)})}else{for(b1 in e){k(b1,e[b1],b0,b2)}}return bZ.join("&").replace(bs,"+")};function k(b0,b2,bZ,b1){var e;if(bG.isArray(b2)){bG.each(b2,function(b4,b3){if(bZ||aP.test(b0)){b1(b0,b3)}else{k(b0+"["+(typeof b3==="object"?b4:"")+"]",b3,bZ,b1)}})}else{if(!bZ&&bG.type(b2)==="object"){for(e in b2){k(b0+"["+e+"]",b2[e],bZ,b1)}}else{b1(b0,b2)}}}var bX,Y,an=/#.*$/,ad=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,B=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aC=/^\/\//,bN=/\?/,g=/)<[^<]*)*<\/script>/gi,P=/([?&])_=[^&]*/,aT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,bW=bG.fn.load,v={},a6={},aX=["*/"]+["*"];try{Y=aI.href}catch(bd){Y=o.createElement("a");Y.href="";Y=Y.href}bX=aT.exec(Y.toLowerCase())||[];function bI(e){return function(b2,b4){if(typeof b2!=="string"){b4=b2;b2="*"}var bZ,b5,b6,b1=b2.toLowerCase().split(aV),b0=0,b3=b1.length;if(bG.isFunction(b4)){for(;b0=0){e=b1.slice(b3,b1.length);b1=b1.slice(0,b3)}if(bG.isFunction(b4)){b5=b4;b4=aB}else{if(b4&&typeof b4==="object"){b2="POST"}}bG.ajax({url:b1,type:b2,dataType:"html",data:b4,complete:function(b7,b6){if(b5){bZ.each(b5,b0||[b7.responseText,b6,b7])}}}).done(function(b6){b0=arguments;bZ.html(e?bG("
        ").append(b6.replace(g,"")).find(e):b6)});return this};bG.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bZ){bG.fn[bZ]=function(b0){return this.on(bZ,b0)}});bG.each(["get","post"],function(e,bZ){bG[bZ]=function(b0,b2,b3,b1){if(bG.isFunction(b2)){b1=b1||b3;b3=b2;b2=aB}return bG.ajax({type:bZ,url:b0,data:b2,success:b3,dataType:b1})}});bG.extend({getScript:function(e,bZ){return bG.get(e,aB,bZ,"script")},getJSON:function(e,bZ,b0){return bG.get(e,bZ,b0,"json")},ajaxSetup:function(bZ,e){if(e){t(bZ,bG.ajaxSettings)}else{e=bZ;bZ=bG.ajaxSettings}t(bZ,e);return bZ},ajaxSettings:{url:Y,isLocal:B.test(bX[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a2.String,"text html":true,"text json":bG.parseJSON,"text xml":bG.parseXML},flatOptions:{context:true,url:true},errorCall:[]},ajaxPrefilter:bI(v),ajaxTransport:bI(a6),ajax:function(b4,b1){if(typeof b4==="object"){b1=b4;b4=aB}b1=b1||{};var b7,cl,b2,cg,b9,cd,b0,cf,b8=bG.ajaxSetup({},b1),cn=b8.context||b8,cb=cn!==b8&&(cn.nodeType||cn instanceof bG)?bG(cn):bG.event,cm=bG.Deferred(),ci=bG.Callbacks("once memory"),b5=b8.statusCode||{},cc={},cj={},b3=0,b6="canceled",ce={readyState:0,setRequestHeader:function(co,cp){if(!b3){var e=co.toLowerCase();co=cj[e]=cj[e]||co;cc[co]=cp}return this},getAllResponseHeaders:function(){return b3===2?cl:null},getResponseHeader:function(co){var e;if(b3===2){if(!b2){b2={};while((e=ad.exec(cl))){b2[e[1].toLowerCase()]=e[2]}}e=b2[co.toLowerCase()]}return e===aB?null:e},overrideMimeType:function(e){if(!b3){b8.mimeType=e}return this},abort:function(e){e=e||b6;if(cg){cg.abort(e)}ca(0,e);return this}};function ca(cs,co,ct,cq){var e,cw,cu,cr,cv,cp=co;if(b3===2){return}b3=2;if(b9){clearTimeout(b9)}cg=aB;cl=cq||"";ce.readyState=cs>0?4:0;if(ct){cr=h(b8,ce,ct)}if(cs>=200&&cs<300||cs===304){if(b8.ifModified){cv=ce.getResponseHeader("Last-Modified");if(cv){bG.lastModified[b7]=cv}cv=ce.getResponseHeader("Etag");if(cv){bG.etag[b7]=cv}}if(cs===304){cp="notmodified";e=true}else{e=ae(b8,cr);cp=e.state;cw=e.data;cu=e.error;e=!cu}}else{cu=cp;if(!cp||cs){cp="error";if(cs<0){cs=0}}}ce.status=cs;ce.statusText=(co||cp)+"";if(e){cm.resolveWith(cn,[cw,cp,ce])}else{bG.ajaxSettings.errorCall=bG.ajaxSettings.errorCall||[];bG.each(bG.ajaxSettings.errorCall,function(cx,cy){if(typeof cy==="function"){cy(cn,cp)}});cm.rejectWith(cn,[ce,cp,cu])}ce.statusCode(b5);b5=aB;if(b0){cb.trigger("ajax"+(e?"Success":"Error"),[ce,b8,e?cw:cu])}ci.fireWith(cn,[ce,cp]);if(b0){cb.trigger("ajaxComplete",[ce,b8]);if(!(--bG.active)){bG.event.trigger("ajaxStop")}}}cm.promise(ce);ce.success=ce.done;ce.error=ce.fail;ce.complete=ci.add;ce.statusCode=function(co){if(co){var e;if(b3<2){for(e in co){b5[e]=[b5[e],co[e]]}}else{e=co[ce.status];ce.always(e)}}return this};b8.url=((b4||b8.url)+"").replace(an,"").replace(aC,bX[1]+"//");b8.dataTypes=bG.trim(b8.dataType||"*").toLowerCase().split(aV);if(b8.crossDomain==null){cd=aT.exec(b8.url.toLowerCase())||false;b8.crossDomain=cd&&(cd.join(":")+(cd[3]?"":cd[1]==="http:"?80:443))!==(bX.join(":")+(bX[3]?"":bX[1]==="http:"?80:443))}if(b8.data&&b8.processData&&typeof b8.data!=="string"){b8.data=bG.param(b8.data,b8.traditional)}q(v,b8,b1,ce);if(b3===2){return ce}b0=b8.global;b8.type=b8.type.toUpperCase();b8.hasContent=!r.test(b8.type);if(b0&&bG.active++===0){bG.event.trigger("ajaxStart")}if(!b8.hasContent){if(b8.data){b8.url+=(bN.test(b8.url)?"&":"?")+b8.data;delete b8.data}b7=b8.url;if(b8.cache===false){var bZ=bG.now(),ck=b8.url.replace(P,"$1_="+bZ);b8.url=ck+((ck===b8.url)?(bN.test(b8.url)?"&":"?")+"_="+bZ:"")}}if(typeof $("#_TOKEN").attr("value")==="string"){b8.url+=(bN.test(b8.url)?"&":"?")+"_TOKEN="+$("#_TOKEN").attr("value")}if(b8.data&&b8.hasContent&&b8.contentType!==false||b1.contentType){ce.setRequestHeader("Content-Type",b8.contentType)}if(b8.ifModified){b7=b7||b8.url;if(bG.lastModified[b7]){ce.setRequestHeader("If-Modified-Since",bG.lastModified[b7])}if(bG.etag[b7]){ce.setRequestHeader("If-None-Match",bG.etag[b7])}}ce.setRequestHeader("Accept",b8.dataTypes[0]&&b8.accepts[b8.dataTypes[0]]?b8.accepts[b8.dataTypes[0]]+(b8.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):b8.accepts["*"]);for(cf in b8.headers){ce.setRequestHeader(cf,b8.headers[cf])}if(b8.beforeSend&&(b8.beforeSend.call(cn,ce,b8)===false||b3===2)){return ce.abort()}b6="abort";for(cf in {success:1,error:1,complete:1}){ce[cf](b8[cf])}cg=q(a6,b8,b1,ce);if(!cg){ca(-1,"No Transport")}else{ce.readyState=1;if(b0){cb.trigger("ajaxSend",[ce,b8])}if(b8.async&&b8.timeout>0){b9=setTimeout(function(){ce.abort("timeout")},b8.timeout)}try{b3=1;cg.send(cc,ca)}catch(ch){if(b3<2){ca(-1,ch)}else{throw ch}}}return ce},active:0,lastModified:{},etag:{}});function h(b7,b6,b3){var b2,b4,b1,e,bZ=b7.contents,b5=b7.dataTypes,b0=b7.responseFields;for(b4 in b0){if(b4 in b3){b6[b0[b4]]=b3[b4]}}while(b5[0]==="*"){b5.shift();if(b2===aB){b2=b7.mimeType||b6.getResponseHeader("content-type")}}if(b2){for(b4 in bZ){if(bZ[b4]&&bZ[b4].test(b2)){b5.unshift(b4);break}}}if(b5[0] in b3){b1=b5[0]}else{for(b4 in b3){if(!b5[0]||b7.converters[b4+" "+b5[0]]){b1=b4;break}if(!e){e=b4}}b1=b1||e}if(b1){if(b1!==b5[0]){b5.unshift(b1)}return b3[b1]}}function ae(b9,b1){var b7,bZ,b5,b3,b6=b9.dataTypes.slice(),b0=b6[0],b8={},b2=0;if(b9.dataFilter){b1=b9.dataFilter(b1,b9.dataType)}if(b6[1]){for(b7 in b9.converters){b8[b7.toLowerCase()]=b9.converters[b7]}}for(;(b5=b6[++b2]);){if(b5!=="*"){if(b0!=="*"&&b0!==b5){b7=b8[b0+" "+b5]||b8["* "+b5];if(!b7){for(bZ in b8){b3=bZ.split(" ");if(b3[1]===b5){b7=b8[b0+" "+b3[0]]||b8["* "+b3[0]];if(b7){if(b7===true){b7=b8[bZ]}else{if(b8[bZ]!==true){b5=b3[0];b6.splice(b2--,0,b5)}}break}}}}if(b7!==true){if(b7&&b9["throws"]){b1=b7(b1)}else{try{b1=b7(b1)}catch(b4){return{state:"parsererror",error:b7?b4:"No conversion from "+b0+" to "+b5}}}}}b0=b5}}return{state:"success",data:b1}}var bp=[],aw=/\?/,a5=/(=)\?(?=&|$)|\?\?/,bl=bG.now();bG.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bp.pop()||(bG.expando+"_"+(bl++));this[e]=true;return e}});bG.ajaxPrefilter("json jsonp",function(b8,b3,b7){var b6,e,b5,b1=b8.data,bZ=b8.url,b0=b8.jsonp!==false,b4=b0&&a5.test(bZ),b2=b0&&!b4&&typeof b1==="string"&&!(b8.contentType||"").indexOf("application/x-www-form-urlencoded")&&a5.test(b1);if(b8.dataTypes[0]==="jsonp"||b4||b2){b6=b8.jsonpCallback=bG.isFunction(b8.jsonpCallback)?b8.jsonpCallback():b8.jsonpCallback;e=a2[b6];if(b4){b8.url=bZ.replace(a5,"$1"+b6)}else{if(b2){b8.data=b1.replace(a5,"$1"+b6)}else{if(b0){b8.url+=(aw.test(bZ)?"&":"?")+b8.jsonp+"="+b6}}}b8.converters["script json"]=function(){if(!b5){bG.error(b6+" was not called")}return b5[0]};b8.dataTypes[0]="json";a2[b6]=function(){b5=arguments};b7.always(function(){a2[b6]=e;if(b8[b6]){b8.jsonpCallback=b3.jsonpCallback;bp.push(b6)}if(b5&&bG.isFunction(e)){e(b5[0])}b5=e=aB});return"script"}});bG.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){bG.globalEval(e);return e}}});bG.ajaxPrefilter("script",function(e){if(e.cache===aB){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bG.ajaxTransport("script",function(b0){if(b0.crossDomain){var e,bZ=o.head||o.getElementsByTagName("head")[0]||o.documentElement;return{send:function(b1,b2){e=o.createElement("script");e.async="async";if(b0.scriptCharset){e.charset=b0.scriptCharset}e.src=b0.url;e.onload=e.onreadystatechange=function(b4,b3){if(b3||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bZ&&e.parentNode){bZ.removeChild(e)}e=aB;if(!b3){b2(200,"success")}}};bZ.insertBefore(e,bZ.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var ah,aN=a2.ActiveXObject?function(){for(var e in ah){ah[e](0,1)}}:false,au=0;function bB(){try{return new a2.XMLHttpRequest()}catch(bZ){}}function bb(){try{return new a2.ActiveXObject("Microsoft.XMLHTTP")}catch(bZ){}}bG.ajaxSettings.xhr=a2.ActiveXObject?function(){return !this.isLocal&&bB()||bb()}:bB;(function(e){bG.extend(bG.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(bG.ajaxSettings.xhr());if(bG.support.ajax){bG.ajaxTransport(function(e){if(!e.crossDomain||bG.support.cors){var bZ;return{send:function(b5,b0){var b3,b2,b4=e.xhr();if(e.username){b4.open(e.type,e.url,e.async,e.username,e.password)}else{b4.open(e.type,e.url,e.async)}if(e.xhrFields){for(b2 in e.xhrFields){b4[b2]=e.xhrFields[b2]}}if(e.mimeType&&b4.overrideMimeType){b4.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b5["X-Requested-With"]){b5["X-Requested-With"]="XMLHttpRequest"}try{for(b2 in b5){b4.setRequestHeader(b2,b5[b2])}}catch(b1){}b4.send((e.hasContent&&e.data)||null);bZ=function(ce,b8){var b9,b7,b6,cc,cb;try{if(bZ&&(b8||b4.readyState===4)){bZ=aB;if(b3){b4.onreadystatechange=bG.noop;if(aN){delete ah[b3]}}if(b8){if(b4.readyState!==4){b4.abort()}}else{b9=b4.status;b6=b4.getAllResponseHeaders();cc={};cb=b4.responseXML;if(cb&&cb.documentElement){cc.xml=cb}try{cc.text=b4.responseText}catch(ce){}try{b7=b4.statusText}catch(cd){b7=""}if(!b9&&e.isLocal&&!e.crossDomain){b9=cc.text?200:404}else{if(b9===1223){b9=204}}}}}catch(ca){if(!b8){b0(-1,ca)}}if(cc){b0(b9,b7,cc,b6)}};if(!e.async){bZ()}else{if(b4.readyState===4){setTimeout(bZ,0)}else{b3=++au;if(aN){if(!ah){ah={};bG(a2).unload(aN)}ah[b3]=bZ}b4.onreadystatechange=bZ}}},abort:function(){if(bZ){bZ(0,1)}}}}})}var L,ab,bO=/^(?:toggle|show|hide)$/,bH=new RegExp("^(?:([-+])=|)("+bx+")([a-z%]*)$","i"),bM=/queueHooks$/,ax=[i],a1={"*":[function(e,b5){var b1,b6,b7=this.createTween(e,b5),b2=bH.exec(b5),b3=b7.cur(),bZ=+b3||0,b0=1,b4=20;if(b2){b1=+b2[2];b6=b2[3]||(bG.cssNumber[e]?"":"px");if(b6!=="px"&&bZ){bZ=bG.css(b7.elem,e,true)||b1||1;do{b0=b0||".5";bZ=bZ/b0;bG.style(b7.elem,e,bZ+b6)}while(b0!==(b0=b7.cur()/b3)&&b0!==1&&--b4)}b7.unit=b6;b7.start=bZ;b7.end=b2[1]?bZ+(b2[1]+1)*b1:b1}return b7}]};function bj(){setTimeout(function(){L=aB},0);return(L=bG.now())}function bc(bZ,e){bG.each(e,function(b4,b2){var b3=(a1[b4]||[]).concat(a1["*"]),b0=0,b1=b3.length;for(;b0-1,b7={},b6={},b0,b2;if(b9){b6=b3.position();b0=b6.top;b2=b6.left}else{b0=parseFloat(e)||0;b2=parseFloat(b8)||0}if(bG.isFunction(ca)){ca=ca.call(b1,b4,bZ)}if(ca.top!=null){b7.top=(ca.top-bZ.top)+b0}if(ca.left!=null){b7.left=(ca.left-bZ.left)+b2}if("using" in ca){ca.using.call(b1,b7)}else{b3.css(b7)}}};bG.fn.extend({position:function(){if(!this[0]){return}var b0=this[0],bZ=this.offsetParent(),b1=this.offset(),e=bm.test(bZ[0].nodeName)?{top:0,left:0}:bZ.offset();b1.top-=parseFloat(bG.css(b0,"marginTop"))||0;b1.left-=parseFloat(bG.css(b0,"marginLeft"))||0;e.top+=parseFloat(bG.css(bZ[0],"borderTopWidth"))||0;e.left+=parseFloat(bG.css(bZ[0],"borderLeftWidth"))||0;return{top:b1.top-e.top,left:b1.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.body;while(e&&(!bm.test(e.nodeName)&&bG.css(e,"position")==="static")){e=e.offsetParent}return e||o.body})}});bG.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b0,bZ){var e=/Y/.test(bZ);bG.fn[b0]=function(b1){return bG.access(this,function(b2,b5,b4){var b3=bn(b2);if(b4===aB){return b3?(bZ in b3)?b3[bZ]:b3.document.documentElement[b5]:b2[b5]}if(b3){b3.scrollTo(!e?b4:bG(b3).scrollLeft(),e?b4:bG(b3).scrollTop())}else{b2[b5]=b4}},b0,b1,arguments.length,null)}});function bn(e){return bG.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bG.each({Height:"height",Width:"width"},function(e,bZ){bG.each({padding:"inner"+e,content:bZ,"":"outer"+e},function(b0,b1){bG.fn[b1]=function(b5,b4){var b3=arguments.length&&(b0||typeof b5!=="boolean"),b2=b0||(b5===true||b4===true?"margin":"border");return bG.access(this,function(b7,b6,b8){var b9;if(bG.isWindow(b7)){return b7.document.documentElement["client"+e]}if(b7.nodeType===9){b9=b7.documentElement;return Math.max(b7.body["scroll"+e],b9["scroll"+e],b7.body["offset"+e],b9["offset"+e],b9["client"+e])}return b8===aB?bG.css(b7,b6,b8,b2):bG.style(b7,b6,b8,b2)},bZ,b3?b5:aB,b3,null)}})});a2.jQuery=a2.$=bG;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return bG})}})(window); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/login/jquery-ui-core.min.js b/len-sys/src/main/resources/plugin/login/jquery-ui-core.min.js new file mode 100644 index 0000000..99015ab --- /dev/null +++ b/len-sys/src/main/resources/plugin/login/jquery-ui-core.min.js @@ -0,0 +1,46 @@ +/*! + * jQuery UI Core lib js + * UI for faisco + * Base On jQuery UI 1.8.24 + * URL:http://www.faisco.com + * @Time 2012-10-29 + * @Last Update Time 2012-10-29 + * + */ +(function(b,e){b.ui=b.ui||{};if(b.ui.version){return}b.extend(b.ui,{version:"@VERSION",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});b.fn.extend({propAttr:b.fn.prop||b.fn.attr,_focus:b.fn.focus,focus:function(f,g){return typeof f==="number"?this.each(function(){var h=this;setTimeout(function(){b(h).focus();if(g){g.call(h)}},f)}):this._focus.apply(this,arguments)},scrollParent:function(){var f;if((b.ui.ie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){f=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(b.css(this,"position"))&&(/(auto|scroll)/).test(b.css(this,"overflow")+b.css(this,"overflow-y")+b.css(this,"overflow-x"))}).eq(0)}else{f=this.parents().filter(function(){return(/(auto|scroll)/).test(b.css(this,"overflow")+b.css(this,"overflow-y")+b.css(this,"overflow-x"))}).eq(0)}return(/fixed/).test(this.css("position"))||!f.length?b(document):f},zIndex:function(i){if(i!==e){return this.css("zIndex",i)}if(this.length){var g=b(this[0]),f,h;while(g.length&&g[0]!==document){f=g.css("position");if(f==="absolute"||f==="relative"||f==="fixed"){h=parseInt(g.css("zIndex"),10);if(!isNaN(h)&&h!==0){return h}}g=g.parent()}}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(f){f.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});if(!b("").outerWidth(1).jquery){b.each(["Width","Height"],function(h,f){var g=f==="Width"?["Left","Right"]:["Top","Bottom"],j=f.toLowerCase(),l={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth,outerHeight:b.fn.outerHeight};function k(n,m,i,o){b.each(g,function(){m-=parseFloat(b.curCSS(n,"padding"+this,true))||0;if(i){m-=parseFloat(b.curCSS(n,"border"+this+"Width",true))||0}if(o){m-=parseFloat(b.curCSS(n,"margin"+this,true))||0}});return m}b.fn["inner"+f]=function(i){if(i===e){return l["inner"+f].call(this)}return this.each(function(){b(this).css(j,k(this,i)+"px")})};b.fn["outer"+f]=function(i,m){if(typeof i!=="number"){return l["outer"+f].call(this,i)}return this.each(function(){b(this).css(j,k(this,i,true,m)+"px")})}})}function d(h,f){var k=h.nodeName.toLowerCase();if("area"===k){var j=h.parentNode,i=j.name,g;if(!h.href||!i||j.nodeName.toLowerCase()!=="map"){return false}g=b("img[usemap=#"+i+"]")[0];return !!g&&c(g)}return(/input|select|textarea|button|object/.test(k)?!h.disabled:"a"==k?h.href||f:f)&&c(h)}function c(f){return !b(f).parents().andSelf().filter(function(){return b.curCSS(this,"visibility")==="hidden"||b.expr.filters.hidden(this)}).length}b.extend(b.expr[":"],{data:b.expr.createPseudo?b.expr.createPseudo(function(f){return function(g){return !!b.data(g,f)}}):function(h,g,f){return !!b.data(h,f[3])},focusable:function(f){return d(f,!isNaN(b.attr(f,"tabindex")))},tabbable:function(h){var f=b.attr(h,"tabindex"),g=isNaN(f);return(g||f>=0)&&d(h,!g)}});b(function(){var f=document.body,g=f.appendChild(g=document.createElement("div"));g.offsetHeight;b.extend(g.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=g.offsetHeight===100;b.support.selectstart="onselectstart" in g;f.removeChild(g).style.display="none"});if(!b.curCSS){b.curCSS=b.css}b.extend(b.ui,{plugin:{add:function(g,h,k){var j=b.ui[g].prototype;for(var f in k){j.plugins[f]=j.plugins[f]||[];j.plugins[f].push([h,k[f]])}},call:function(f,h,g){var k=f.plugins[h];if(!k||!f.element[0].parentNode){return}for(var j=0;j0){return true}i[f]=1;h=(i[f]>0);i[f]=0;return h},isOverAxis:function(g,f,h){return(g>f)&&(g<(f+h))},isOver:function(k,g,j,i,f,h){return b.ui.isOverAxis(k,j,f)&&b.ui.isOverAxis(g,i,h)}})})(jQuery);(function(c,e){if(c.cleanData){var d=c.cleanData;c.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{c(h).triggerHandler("remove")}catch(j){}}d(f)}}else{var b=c.fn.remove;c.fn.remove=function(f,g){return this.each(function(){if(!g){if(!f||c.filter(f,[this]).length){c("*",this).add([this]).each(function(){try{c(this).triggerHandler("remove")}catch(h){}})}}return b.call(c(this),f,g)})}}c.widget=function(g,i,f){var h=g.split(".")[0],k;g=g.split(".")[1];k=h+"-"+g;if(!f){f=i;i=c.Widget}c.expr[":"][k]=function(l){return !!c.data(l,g)};c[h]=c[h]||{};c[h][g]=function(l,m){if(arguments.length){this._createWidget(l,m)}};var j=new i();j.options=c.extend(true,{},j.options);c[h][g].prototype=c.extend(true,j,{namespace:h,widgetName:g,widgetEventPrefix:c[h][g].prototype.widgetEventPrefix||g,widgetBaseClass:k},f);c.widget.bridge(g,c[h][g])};c.widget.bridge=function(g,f){c.fn[g]=function(j){var h=typeof j==="string",i=Array.prototype.slice.call(arguments,1),k=this;j=!h&&i.length?c.extend.apply(null,[true,j].concat(i)):j;if(h&&j.charAt(0)==="_"){return k}if(h){this.each(function(){var l=c.data(this,g),m=l&&c.isFunction(l[j])?l[j].apply(l,i):l;if(m!==l&&m!==e){k=m;return false}})}else{this.each(function(){var l=c.data(this,g);if(l){l.option(j||{})._init()}else{c.data(this,g,new f(j,this))}})}return k}};c.Widget=function(f,g){if(arguments.length){this._createWidget(f,g)}};c.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(g,h){c.data(h,this.widgetName,this);this.element=c(h);this.options=c.extend(true,{},this.options,this._getCreateOptions(),g);var f=this;this.element.bind("remove."+this.widgetName,function(){f.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return c.metadata&&c.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(g,h){var f=g;if(arguments.length===0){return c.extend({},this.options)}if(typeof g==="string"){if(h===e){return this.options[g]}f={};f[g]=h}this._setOptions(f);return this},_setOptions:function(g){var f=this;c.each(g,function(h,i){f._setOption(h,i)});return this},_setOption:function(f,g){this.options[f]=g;if(f==="disabled"){this.widget()[g?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",g)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(f,g,h){var k,j,i=this.options[f];h=h||{};g=c.Event(g);g.type=(f===this.widgetEventPrefix?f:this.widgetEventPrefix+f).toLowerCase();g.target=this.element[0];j=g.originalEvent;if(j){for(k in j){if(!(k in g)){g[k]=j[k]}}}this.element.trigger(g,h);return !(c.isFunction(i)&&i.call(this.element[0],g,h)===false||g.isDefaultPrevented())}}})(jQuery);(function(c,d){var b=false;c(document).mouseup(function(f){b=false});c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(f){return e._mouseDown(f)}).bind("click."+this.widgetName,function(f){if(true===c.data(f.target,e.widgetName+".preventClickEvent")){c.removeData(f.target,e.widgetName+".preventClickEvent");f.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);if(this._mouseMoveDelegate){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)}},_mouseDown:function(g){if(b){return}(this._mouseStarted&&this._mouseUp(g));this._mouseDownEvent=g;var f=this,h=(g.which==1),e=(typeof this.options.cancel=="string"&&g.target.nodeName?c(g.target).closest(this.options.cancel).length:false);if(!h||e||!this._mouseCapture(g)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){f.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(g)&&this._mouseDelayMet(g)){this._mouseStarted=(this._mouseStart(g)!==false);if(!this._mouseStarted){g.preventDefault();return true}}if(true===c.data(g.target,this.widgetName+".preventClickEvent")){c.removeData(g.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(i){return f._mouseMove(i)};this._mouseUpDelegate=function(i){return f._mouseUp(i)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);g.preventDefault();b=true;return true},_mouseMove:function(e){if(c.browser.msie&&!(document.documentMode>=9)&&!e.button){return this._mouseUp(e)}if(this._mouseStarted){this._mouseDrag(e);return e.preventDefault()}if(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,e)!==false);(this._mouseStarted?this._mouseDrag(e):this._mouseUp(e))}return !this._mouseStarted},_mouseUp:function(e){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(e.target==this._mouseDownEvent.target){c.data(e.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(e)}return false},_mouseDistanceMet:function(e){return(Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance)},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return true}})})(jQuery);(function(b,c){b.widget("ui.sortable",b.ui.mouse,{widgetEventPrefix:"sort",ready:false,options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000},_create:function(){var d=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?d.axis==="x"||(/left|right/).test(this.items[0].item.css("float"))||(/inline|table-cell/).test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit();this.ready=true},destroy:function(){b.Widget.prototype.destroy.call(this);this.element.removeClass("ui-sortable ui-sortable-disabled");this._mouseDestroy();for(var d=this.items.length-1;d>=0;d--){this.items[d].item.removeData(this.widgetName+"-item")}return this},_setOption:function(d,e){if(d==="disabled"){this.options[d]=e;this.widget()[e?"addClass":"removeClass"]("ui-sortable-disabled")}else{b.Widget.prototype._setOption.apply(this,arguments)}},_mouseCapture:function(h,i){var g=this;if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(h);var f=null,e=this,d=b(h.target).parents().each(function(){if(b.data(this,g.widgetName+"-item")==e){f=b(this);return false}});if(b.data(h.target,g.widgetName+"-item")==e){f=b(h.target)}if(!f){return false}if(this.options.handle&&!i){var j=false;b(this.options.handle,f).find("*").andSelf().each(function(){if(this==h.target){j=true}});if(!j){return false}}this.currentItem=f;this._removeCurrentsFromItems();return true},_mouseStart:function(g,h,d){var j=this.options,e=this;this.currentContainer=this;this._trigger("beforeStart",g,this._uiHash());this._refreshItems(g);this.refreshPositions();this.helper=this._createHelper(g);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:g.pageX-this.offset.left,top:g.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");this.originalPosition=this._generatePosition(g);this.originalPageX=g.pageX;this.originalPageY=g.pageY;(j.cursorAt&&this._adjustOffsetFromHelper(j.cursorAt));this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(j.containment){this._setContainment()}if(j.cursor){if(b("body").css("cursor")){this._storedCursor=b("body").css("cursor")}b("body").css("cursor",j.cursor)}if(j.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",j.opacity)}if(j.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",j.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",g,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!d){for(var f=this.containers.length-1;f>=0;f--){this.containers[f]._trigger("activate",g,e._uiHash(this))}}if(b.ui.ddmanager){b.ui.ddmanager.current=this}if(b.ui.ddmanager&&!j.dropBehaviour){b.ui.ddmanager.prepareOffsets(this,g)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(g);return true},_mouseDrag:function(h){this.position=this._generatePosition(h);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var j=this.options,d=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-h.pageY=0;f--){var g=this.items[f],e=g.item[0],k=this._intersectsWithPointer(g);if(!k){continue}if(g.instance!==this.currentContainer){continue}if(e!=this.currentItem[0]&&this.placeholder[k==1?"next":"prev"]()[0]!=e&&!b.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!b.ui.contains(this.element[0],e):true)){this.direction=k==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(g)){this._rearrange(h,g)}else{break}this._trigger("change",h,this._uiHash());break}}this._contactContainers(h);if(b.ui.ddmanager){b.ui.ddmanager.drag(this,h)}this._trigger("sort",h,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(e,f){if(!e){return}if(b.ui.ddmanager&&!this.options.dropBehaviour){b.ui.ddmanager.drop(this,e)}if(this.options.revert){var d=this;var g=d.placeholder.offset();d.reverting=true;b(this.helper).animate({left:g.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:g.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(e)})}else{this._clear(e,f)}return false},cancel:function(){var d=this;if(this.dragging){this._mouseUp({target:null});if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var e=this.containers.length-1;e>=0;e--){this.containers[e]._trigger("deactivate",null,d._uiHash(this));if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",null,d._uiHash(this));this.containers[e].containerCache.over=0}}}if(this.placeholder){if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}b.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){b(this.domPosition.prev).after(this.currentItem)}else{b(this.domPosition.parent).prepend(this.currentItem)}}return this},serialize:function(f){var d=this._getItemsAsjQuery(f&&f.connected);var e=[];f=f||{};b(d).each(function(){var g=(b(f.item||this).attr(f.attribute||"id")||"").match(f.expression||(/(.+)[-=_](.+)/));if(g){e.push((f.key||g[1]+"[]")+"="+(f.key&&f.expression?g[1]:g[2]))}});if(!e.length&&f.key){e.push(f.key+"=")}return e.join("&")},toArray:function(f){var d=this._getItemsAsjQuery(f&&f.connected);var e=[];f=f||{};d.each(function(){e.push(b(f.item||this).attr(f.attribute||"id")||"")});return e},_intersectsWith:function(n){var f=this.positionAbs.left,e=f+this.helperProportions.width,m=this.positionAbs.top,k=m+this.helperProportions.height;var g=n.left,d=g+n.width,o=n.top,j=o+n.height;var p=this.offset.click.top,i=this.offset.click.left;var h=(m+p)>o&&(m+p)g&&(f+i)n[this.floating?"width":"height"])){return h}else{return(g0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var n=this;var k=[];var g=[];var l=this._connectWith();if(l&&d){for(var f=l.length-1;f>=0;f--){var m=b(l[f]);for(var e=m.length-1;e>=0;e--){var h=b.data(m[e],this.widgetName);if(h&&h!=this&&!h.options.disabled){g.push([b.isFunction(h.options.items)?h.options.items.call(h.element):b(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}}}}g.push([b.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):b(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var f=g.length-1;f>=0;f--){g[f][0].each(function(){k.push(this)})}return b(k)},_removeCurrentsFromItems:function(){var f=this.currentItem.find(":data("+this.widgetName+"-item)");for(var e=0;e=0;g--){var o=b(n[g]);for(var f=o.length-1;f>=0;f--){var k=b.data(o[f],this.widgetName);if(k&&k!=this&&!k.options.disabled){h.push([b.isFunction(k.options.items)?k.options.items.call(k.element[0],d,{item:this.currentItem}):b(k.options.items,k.element),k]);this.containers.push(k)}}}}for(var g=h.length-1;g>=0;g--){var m=h[g][1];var e=h[g][0];for(var f=0,p=e.length;f=0;f--){var g=this.items[f];if(g.instance!=this.currentContainer&&this.currentContainer&&g.item[0]!=this.currentItem[0]){continue}var e=this.options.toleranceElement?b(this.options.toleranceElement,g.item):g.item;if(!d){g.width=e.outerWidth();g.height=e.outerHeight()}var h=e.offset();g.left=h.left;g.top=h.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var f=this.containers.length-1;f>=0;f--){var h=this.containers[f].element.offset();this.containers[f].containerCache.left=h.left;this.containers[f].containerCache.top=h.top;this.containers[f].containerCache.width=this.containers[f].element.outerWidth();this.containers[f].containerCache.height=this.containers[f].element.outerHeight()}}return this},_createPlaceholder:function(f){var d=f||this,g=d.options;if(!g.placeholder||g.placeholder.constructor==String){var e=g.placeholder;g.placeholder={element:function(){var h=b(document.createElement(d.currentItem[0].nodeName)).addClass(e||d.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e){h.style.visibility="hidden"}return h},update:function(h,i){if(e&&!g.forcePlaceholderSize){return}if(!i.height()){i.height(d.currentItem.innerHeight()-parseInt(d.currentItem.css("paddingTop")||0,10)-parseInt(d.currentItem.css("paddingBottom")||0,10))}if(!i.width()){i.width(d.currentItem.innerWidth()-parseInt(d.currentItem.css("paddingLeft")||0,10)-parseInt(d.currentItem.css("paddingRight")||0,10))}}}}d.placeholder=b(g.placeholder.element.call(d.element,d.currentItem));d.currentItem.after(d.placeholder);g.placeholder.update(d,d.placeholder)},_contactContainers:function(d){var f=null,m=null;for(var h=this.containers.length-1;h>=0;h--){if(b.ui.contains(this.currentItem[0],this.containers[h].element[0])){continue}if(this._intersectsWith(this.containers[h].containerCache)){if(f&&b.ui.contains(this.containers[h].element[0],f.element[0])){continue}f=this.containers[h];m=h}else{if(this.containers[h].containerCache.over){this.containers[h]._trigger("out",d,this._uiHash(this));this.containers[h].containerCache.over=0}}}if(!f){return}if(this.containers.length===1){this.containers[m]._trigger("over",d,this._uiHash(this));this.containers[m].containerCache.over=1}else{if(this.currentContainer!=this.containers[m]){var l=10000;var k=null;var e=this.positionAbs[this.containers[m].floating?"left":"top"];for(var g=this.items.length-1;g>=0;g--){if(!b.ui.contains(this.containers[m].element[0],this.items[g].item[0])){continue}var n=this.containers[m].floating?this.items[g].item.offset().left:this.items[g].item.offset().top;if(Math.abs(n-e)0)?"down":"up"}}if(!k&&!this.options.dropOnEmpty){return}this.currentContainer=this.containers[m];k?this._rearrange(d,k,null,true):this._rearrange(d,null,this.containers[m].element,true);this._trigger("change",d,this._uiHash());this.containers[m]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[m]._trigger("over",d,this._uiHash(this));this.containers[m].containerCache.over=1}}},_createHelper:function(e){var f=this.options;var d=b.isFunction(f.helper)?b(f.helper.apply(this.element[0],[e,this.currentItem])):(f.helper=="clone"?this.currentItem.clone():this.currentItem);if(!d.parents("body").length){b(f.appendTo!="parent"?f.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0])}if(d[0]==this.currentItem[0]){this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}}if(d[0].style.width==""||f.forceHelperSize){d.width(this.currentItem.width())}if(d[0].style.height==""||f.forceHelperSize){d.height(this.currentItem.height())}return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string"){d=d.split(" ")}if(b.isArray(d)){d={left:+d[0],top:+d[1]||0}}if("left" in d){this.offset.click.left=d.left+this.margins.left}if("right" in d){this.offset.click.left=this.helperProportions.width-d.right+this.margins.left}if("top" in d){this.offset.click.top=d.top+this.margins.top}if("bottom" in d){this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)){d={top:0,left:0}}return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.currentItem.css("marginLeft"),10)||0),top:(parseInt(this.currentItem.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var g=this.options;if(g.containment=="parent"){g.containment=this.helper[0].parentNode}if(g.containment=="document"||g.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,b(g.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b(g.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(g.containment)){var e=b(g.containment)[0];var f=b(g.containment).offset();var d=(b(e).css("overflow")!="hidden");this.containment=[f.left+(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0)-this.margins.left,f.top+(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0)-this.margins.top,f.left+(d?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,f.top+(d?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(h,j){if(!j){j=this.position}var f=h=="absolute"?1:-1;var g=this.options,e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(e[0].tagName);return{top:(j.top+this.offset.relative.top*f+this.offset.parent.top*f-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:e.scrollTop()))*f)),left:(j.left+this.offset.relative.left*f+this.offset.parent.left*f-(b.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:e.scrollLeft())*f))}},_generatePosition:function(g){var j=this.options,d=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,k=(/(html|body)/i).test(d[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var f=g.pageX;var e=g.pageY;if(this.originalPosition){if(this.containment){if(g.pageX-this.offset.click.leftthis.containment[2]){f=this.containment[2]+this.offset.click.left}if(g.pageY-this.offset.click.top>this.containment[3]){e=this.containment[3]+this.offset.click.top}}if(j.grid){var i=this.originalPageY+Math.round((e-this.originalPageY)/j.grid[1])*j.grid[1];e=this.containment?(!(i-this.offset.click.topthis.containment[3])?i:(!(i-this.offset.click.topthis.containment[2])?h:(!(h-this.offset.click.left=0;e--){if(!g){h.push((function(i){return function(j){i._trigger("deactivate",j,this._uiHash(this))}}).call(this,this.containers[e]))}if(this.containers[e].containerCache.over){h.push((function(i){return function(j){i._trigger("out",j,this._uiHash(this))}}).call(this,this.containers[e]));this.containers[e].containerCache.over=0}}if(this._storedCursor){b("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!g){this._trigger("beforeStop",f,this._uiHash());for(var e=0;e
        ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(b(this).offset()).appendTo("body")})}return true},_mouseStart:function(d){var e=this.options;this.helper=this._createHelper(d);this.helper.addClass("ui-draggable-dragging");this._cacheHelperProportions();this._trigger("beforeStart",d,this._uiHash());if(b.ui.ddmanager){b.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;(e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt));if(e.containment){this._setContainment()}if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();if(b.ui.ddmanager&&!e.dropBehaviour){b.ui.ddmanager.prepareOffsets(this,d)}this._mouseDrag(d,true);if(b.ui.ddmanager){b.ui.ddmanager.dragStart(this,d)}return true},_mouseDrag:function(e,j){this.position=this._generatePosition(e);this.positionAbs=this._convertPositionTo("absolute");if(!j){var i=this._uiHash();if(this._trigger("drag",e,i)===false){this._mouseUp({});return false}this.position=i.position}var d=b(window).width();var g=b(window).height();var f=this.helper.outerWidth();var n=this.helper.outerHeight();var k=this.position.top;var h=this.position.left;var m=g-n;var l=d-f;if(k<=0){k=0}if(h<=0){h=0}if(h>=l){h=l}if(k>=m){k=m}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=h+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=k+"px"}if(b.ui.ddmanager){b.ui.ddmanager.drag(this,e)}return false},_mouseStop:function(f){var h=false;if(b.ui.ddmanager&&!this.options.dropBehaviour){h=b.ui.ddmanager.drop(this,f)}if(this.dropped){h=this.dropped;this.dropped=false}var e=this.element[0],g=false;while(e&&(e=e.parentNode)){if(e==document){g=true}}if(!g&&this.options.helper==="original"){return false}if((this.options.revert=="invalid"&&!h)||(this.options.revert=="valid"&&h)||this.options.revert===true||(b.isFunction(this.options.revert)&&this.options.revert.call(this.element,h))){var d=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(d._trigger("stop",f)!==false){d._clear()}})}else{if(this._trigger("stop",f)!==false){this._clear()}}return false},_mouseUp:function(d){b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});if(b.ui.ddmanager){b.ui.ddmanager.dragStop(this,d)}return b.ui.mouse.prototype._mouseUp.call(this,d)},cancel:function(){if(this.helper.is(".ui-draggable-dragging")){this._mouseUp({})}else{this._clear()}return this},_getHandle:function(d){var e=!this.options.handle||!b(this.options.handle,this.element).length?true:false;b(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==d.target){e=true}});return e},_createHelper:function(e){var f=this.options;var d=b.isFunction(f.helper)?b(f.helper.apply(this.element[0],[e])):(f.helper=="clone"?this.element.clone().removeAttr("id"):this.element);if(!d.parents("body").length){d.appendTo((f.appendTo=="parent"?this.element[0].parentNode:f.appendTo))}if(d[0]!=this.element[0]&&!(/(fixed|absolute)/).test(d.css("position"))){d.css("position","absolute")}return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string"){d=d.split(" ")}if(b.isArray(d)){d={left:+d[0],top:+d[1]||0}}if("left" in d){this.offset.click.left=d.left+this.margins.left}if("right" in d){this.offset.click.left=this.helperProportions.width-d.right+this.margins.left}if("top" in d){this.offset.click.top=d.top+this.margins.top}if("bottom" in d){this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&b.browser.msie)){d={top:0,left:0}}return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0),right:(parseInt(this.element.css("marginRight"),10)||0),bottom:(parseInt(this.element.css("marginBottom"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var g=this.options;if(g.containment=="parent"){g.containment=this.helper[0].parentNode}if(g.containment=="document"||g.containment=="window"){this.containment=[g.containment=="document"?0:b(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,g.containment=="document"?0:b(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(g.containment=="document"?0:b(window).scrollLeft())+b(g.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(g.containment=="document"?0:b(window).scrollTop())+(b(g.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(g.containment)&&g.containment.constructor!=Array){var h=b(g.containment);var e=h[0];if(!e){return}var f=h.offset();var d=(b(e).css("overflow")!="hidden");this.containment=[(parseInt(b(e).css("borderLeftWidth"),10)||0)+(parseInt(b(e).css("paddingLeft"),10)||0),(parseInt(b(e).css("borderTopWidth"),10)||0)+(parseInt(b(e).css("paddingTop"),10)||0),(d?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(b(e).css("borderLeftWidth"),10)||0)-(parseInt(b(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(d?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(b(e).css("borderTopWidth"),10)||0)-(parseInt(b(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=h}else{if(g.containment.constructor==Array){this.containment=g.containment}}},_convertPositionTo:function(h,j){if(!j){j=this.position}var f=h=="absolute"?1:-1;var g=this.options,e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(e[0].tagName);return{top:(j.top+this.offset.relative.top*f+this.offset.parent.top*f-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:e.scrollTop()))*f)),left:(j.left+this.offset.relative.left*f+this.offset.parent.left*f-(b.browser.safari&&b.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:e.scrollLeft())*f))}},_generatePosition:function(e){var f=this.options,m=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,j=(/(html|body)/i).test(m[0].tagName);var i=e.pageX;var h=e.pageY;if(this.originalPosition){var d;if(this.containment){if(this.relative_container){var l=this.relative_container.offset();d=[this.containment[0]+l.left,this.containment[1]+l.top,this.containment[2]+l.left,this.containment[3]+l.top]}else{d=this.containment}if(e.pageX-this.offset.click.leftd[2]){i=d[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>d[3]){h=d[3]+this.offset.click.top}}if(f.grid){var k=f.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/f.grid[1])*f.grid[1]:this.originalPageY;h=d?(!(k-this.offset.click.topd[3])?k:(!(k-this.offset.click.topd[2])?g:(!(g-this.offset.click.left=0;w--){var u=h.snapElements[w].left,p=u+h.snapElements[w].width,n=h.snapElements[w].top,B=n+h.snapElements[w].height;if(!((u-z").addClass("ui-autocomplete").appendTo(b(this.options.appendTo||"body",g)[0]).mousedown(function(h){var i=e.menu.element[0];if(!b(h.target).closest(".ui-menu-item").length){setTimeout(function(){b(document).one("mousedown",function(j){if(j.target!==e.element[0]&&j.target!==i&&!b.ui.contains(i,j.target)){e.close()}})},1)}setTimeout(function(){clearTimeout(e.closing)},13)}).menu({focus:function(i,j){var h=j.item.data("item.autocomplete");if(false!==e._trigger("focus",i,{item:h})){if(/^key/.test(i.originalEvent.type)){e.element.val(h.value)}}},selected:function(j,k){var i=k.item.data("item.autocomplete"),h=e.previous;if(e.element[0]!==g.activeElement){e.element.focus();e.previous=h;setTimeout(function(){e.previous=h;e.selectedItem=i},1)}if(false!==e._trigger("select",j,{item:i})){e.element.val(i.value)}e.term=e.element.val();e.close(j);e.selectedItem=i},blur:function(h,i){if(e.menu.element.is(":visible")&&(e.element.val()!==e.term)){e.element.val(e.term)}}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");if(b.fn.bgiframe){this.menu.element.bgiframe()}e.beforeunloadHandler=function(){e.element.removeAttr("autocomplete")};b(window).bind("beforeunload",e.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();b(window).unbind("beforeunload",this.beforeunloadHandler);b.Widget.prototype.destroy.call(this)},_setOption:function(e,f){b.Widget.prototype._setOption.apply(this,arguments);if(e==="source"){this._initSource()}if(e==="appendTo"){this.menu.element.appendTo(b(f||"body",this.element[0].ownerDocument)[0])}if(e==="disabled"&&f&&this.xhr){this.xhr.abort()}},_initSource:function(){var e=this,g,f;if(b.isArray(this.options.source)){g=this.options.source;this.source=function(i,h){h(b.ui.autocomplete.filter(g,i.term))}}else{if(typeof this.options.source==="string"){f=this.options.source;this.source=function(i,h){if(e.xhr){e.xhr.abort()}e.xhr=b.ajax({url:f,data:i,dataType:"json",success:function(k,j){h(k)},error:function(){h([])}})}}else{this.source=this.options.source}}},search:function(f,e){f=f!=null?f:this.element.val();this.term=this.element.val();if(f.length0){f=h.preLabel+f}var e=b("").text(f);if(typeof h.title==="string"&&h.title.length>0){e.attr("title",h.title)}return b("
      • ").attr("title",h.label).data("item.autocomplete",h).append(e).appendTo(g)},_move:function(f,e){if(!this.menu.element.is(":visible")){this.search(null,e);return}if(this.menu.first()&&/^previous/.test(f)||this.menu.last()&&/^next/.test(f)){this.element.val(this.term);this.menu.deactivate();return}this.menu[f](e)},widget:function(){return this.menu.element},_keyEvent:function(f,e){if(!this.isMultiLine||this.menu.element.is(":visible")){this._move(f,e);e.preventDefault()}}});b.extend(b.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(g,e){var f=new RegExp(b.ui.autocomplete.escapeRegex(e),"i");return b.grep(g,function(h){return f.test(h.label||h.value||h)})}})}(jQuery));(function(b){b.widget("ui.menu",{_create:function(){var c=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(d){if(!b(d.target).closest(".ui-menu-item a").length){return}d.preventDefault();c.select(d)});this.refresh()},refresh:function(){var d=this;var c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(e){d.activate(e,b(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(f,e){this.deactivate();if(this.hasScroll()){var g=e.offset().top-this.element.offset().top,c=this.element.scrollTop(),d=this.element.height();if(g<0){this.element.scrollTop(c+g)}else{if(g>=d){this.element.scrollTop(c+g-d+e.height())}}}this.active=e.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",f,{item:e})},deactivate:function(){if(!this.active){return}this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null},next:function(c){this.move("next",".ui-menu-item:first",c)},previous:function(c){this.move("prev",".ui-menu-item:last",c)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(f,e,d){if(!this.active){this.activate(d,this.element.children(e));return}var c=this.active[f+"All"](".ui-menu-item").eq(0);if(c.length){this.activate(d,c)}else{this.activate(d,this.element.children(e))}},nextPage:function(e){if(this.hasScroll()){if(!this.active||this.last()){this.activate(e,this.element.children(".ui-menu-item:first"));return}var f=this.active.offset().top,d=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var g=b(this).offset().top-f-d+b(this).height();return g<10&&g>-10});if(!c.length){c=this.element.children(".ui-menu-item:last")}this.activate(e,c)}else{this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))}},previousPage:function(e){if(this.hasScroll()){if(!this.active||this.first()){this.activate(e,this.element.children(".ui-menu-item:last"));return}var f=this.active.offset().top,d=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var g=b(this).offset().top-f+d-b(this).height();return g<10&&g>-10});if(!c.length){c=this.element.children(".ui-menu-item:first")}this.activate(e,c)}else{this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))}},hasScroll:function(){return this.element.height()0?j.left-l:Math.max(j.left-k.collisionPosition.left,j.left)},top:function(j,k){var m=h(window),l=k.collisionPosition.top+k.collisionHeight-m.height()-m.scrollTop();j.top=l>0?j.top-l:Math.max(j.top-k.collisionPosition.top,j.top)}},flip:{left:function(k,m){if(m.at[0]===b){return}var o=h(window),n=m.collisionPosition.left+m.collisionWidth-o.width()-o.scrollLeft(),j=m.my[0]==="left"?-m.elemWidth:m.my[0]==="right"?m.elemWidth:0,l=m.at[0]==="left"?m.targetWidth:-m.targetWidth,p=-2*m.offset[0];k.left+=m.collisionPosition.left<0?j+l+p:n>0?j+l+p:0},top:function(k,m){if(m.at[1]===b){return}var o=h(window),n=m.collisionPosition.top+m.collisionHeight-o.height()-o.scrollTop(),j=m.my[1]==="top"?-m.elemHeight:m.my[1]==="bottom"?m.elemHeight:0,l=m.at[1]==="top"?m.targetHeight:-m.targetHeight,p=-2*m.offset[1];k.top+=m.collisionPosition.top<0?j+l+p:n>0?j+l+p:0}}};if(!h.offset.setOffset){h.offset.setOffset=function(n,k){if(/static/.test(h.curCSS(n,"position"))){n.style.position="relative"}var m=h(n),p=m.offset(),j=parseInt(h.curCSS(n,"top",true),10)||0,o=parseInt(h.curCSS(n,"left",true),10)||0,l={top:(k.top-p.top)+j,left:(k.left-p.left)+o};if("using" in k){k.using.call(n,l)}else{m.css(l)}};h.fn.offset=function(j){var k=this[0];if(!k||!k.ownerDocument){return null}if(j){if(h.isFunction(j)){return this.each(function(l){h(this).offset(j.call(this,l,h(this).offset()))})}return this.each(function(){h.offset.setOffset(this,j)})}return d.call(this)}}if(!h.curCSS){h.curCSS=h.css}(function(){var j=document.getElementsByTagName("body")[0],q=document.createElement("div"),n,p,k,o,m;n=document.createElement(j?"div":"body");k={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};if(j){h.extend(k,{position:"absolute",left:"-1000px",top:"-1000px"})}for(var l in k){n.style[l]=k[l]}n.appendChild(q);p=j||document.documentElement;p.insertBefore(n,p.firstChild);q.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";o=h(q).offset(function(r,s){return s}).offset();n.innerHTML="";p.removeChild(n);m=o.top+o.left+(j?2000:0);g.fractions=m>21&&m<22})()}(jQuery));(function(d,e){d.widget("ui.resizable",d.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var g=this,l=this.options;this.element.addClass("ui-resizable");d.extend(this,{_aspectRatio:!!(l.aspectRatio),aspectRatio:l.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:l.helper||l.ghost||l.animate?l.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(d('
        ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=l.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var m=this.handles.split(",");this.handles={};for(var h=0;h');j.css({zIndex:l.zIndex});if("se"==k){j.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[k]=".ui-resizable-"+k;this.element.append(j)}}this._renderAxis=function(r){r=r||this.element;for(var o in this.handles){if(this.handles[o].constructor==String){this.handles[o]=d(this.handles[o],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var p=d(this.handles[o],this.element),q=0;q=/sw|ne|nw|se|n|s/.test(o)?p.outerHeight():p.outerWidth();var n=["padding",/ne|nw|n/.test(o)?"Top":/se|sw|s/.test(o)?"Bottom":/^e$/.test(o)?"Right":"Left"].join("");r.css(n,q);this._proportionallyResize()}if(!d(this.handles[o]).length){continue}}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!g.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}g.axis=i&&i[1]?i[1]:"se"}});if(l.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){if(l.disabled){return}d(this).removeClass("ui-resizable-autohide");g._handles.show()},function(){if(l.disabled){return}if(!g.resizing){d(this).addClass("ui-resizable-autohide");g._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var f=function(h){d(h).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){f(this.element);var g=this.element;g.after(this.originalElement.css({position:g.css("position"),width:g.outerWidth(),height:g.outerHeight(),top:g.css("top"),left:g.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);f(this.originalElement);return this},_mouseCapture:function(g){var h=false;for(var f in this.handles){if(d(this.handles[f])[0]==g.target||d(this.handles[f])[0]==g.target.parentNode){h=true}}return !this.options.disabled&&h},_mouseStart:function(h){var k=this.options,g=this.element.position(),f=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(f.is(".ui-draggable")||(/absolute/).test(f.css("position"))){f.css({position:"absolute",top:g.top,left:g.left})}this._renderProxy();var l=c(this.helper.css("left")),i=c(this.helper.css("top"));if(k.containment){l+=d(k.containment).scrollLeft()||0;i+=d(k.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:l,top:i};this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()};this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()};this.originalPosition={left:l,top:i};this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()};this.originalMousePosition={left:h.pageX,top:h.pageY};this.aspectRatio=(typeof k.aspectRatio=="number")?k.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var j=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",j=="auto"?this.axis+"-resize":j);f.addClass("ui-resizable-resizing");this._propagate("start",h);return true},_mouseDrag:function(f){var i=this.helper,h=this.options,n={},r=this,k=this.originalMousePosition,p=this.axis;var s=(f.pageX-k.left)||0,q=(f.pageY-k.top)||0;var j=this._change[p];if(!j){return false}var m=j.apply(this,[f,s,q]),l=d.browser.msie&&d.browser.version<7,g=this.sizeDiff;this._updateVirtualBoundaries(f.shiftKey);if(this._aspectRatio||f.shiftKey){m=this._updateRatio(m,f)}m=this._respectSize(m,f);this._propagate("resize",f);i.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(m);this._trigger("resize",f,this.ui());return false},_mouseStop:function(i){this.resizing=false;var j=this.options,n=this;if(this._helper){var h=this._proportionallyResizeElements,f=h.length&&(/textarea/i).test(h[0].nodeName),g=f&&d.ui.hasScroll(h[0],"left")?0:n.sizeDiff.height,l=f?0:n.sizeDiff.width;var p={width:(n.helper.width()-l),height:(n.helper.height()-g)},k=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,m=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;if(!j.animate){this.element.css(d.extend(p,{top:m,left:k}))}n.helper.height(n.size.height);n.helper.width(n.size.width);if(this._helper&&!j.animate){this._proportionallyResize()}}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",i);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(h){var k=this.options,j,i,g,l,f;f={minWidth:b(k.minWidth)?k.minWidth:0,maxWidth:b(k.maxWidth)?k.maxWidth:Infinity,minHeight:b(k.minHeight)?k.minHeight:0,maxHeight:b(k.maxHeight)?k.maxHeight:Infinity};if(this._aspectRatio||h){j=f.minHeight*this.aspectRatio;g=f.minWidth/this.aspectRatio;i=f.maxHeight*this.aspectRatio;l=f.maxWidth/this.aspectRatio;if(j>f.minWidth){f.minWidth=j}if(g>f.minHeight){f.minHeight=g}if(im.width),t=b(m.height)&&j.minHeight&&(j.minHeight>m.height);if(i){m.width=j.minWidth}if(t){m.height=j.minHeight}if(u){m.width=j.maxWidth}if(n){m.height=j.maxHeight}var g=this.originalPosition.left+this.originalSize.width,q=this.position.top+this.size.height;var l=/sw|nw|w/.test(r),f=/nw|ne|n/.test(r);if(i&&l){m.left=g-j.minWidth}if(u&&l){m.left=g-j.maxWidth}if(t&&f){m.top=q-j.minHeight}if(n&&f){m.top=q-j.maxHeight}var p=!m.width&&!m.height;if(p&&!m.left&&m.top){m.top=null}else{if(p&&!m.top&&m.left){m.left=null}}return m},_proportionallyResize:function(){var l=this.options;if(!this._proportionallyResizeElements.length){return}var h=this.helper||this.element;for(var g=0;g');var f=d.browser.msie&&d.browser.version<7,h=(f?1:0),i=(f?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+i,height:this.element.outerHeight()+i,position:"absolute",left:this.elementOffset.left-h+"px",top:this.elementOffset.top-h+"px",zIndex:++j.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(h,g,f){return{width:this.originalSize.width+g}},w:function(i,g,f){var k=this.options,h=this.originalSize,j=this.originalPosition;return{left:j.left+g,width:h.width-g}},n:function(i,g,f){var k=this.options,h=this.originalSize,j=this.originalPosition;return{top:j.top+f,height:h.height-f}},s:function(h,g,f){return{height:this.originalSize.height+f}},se:function(h,g,f){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[h,g,f]))},sw:function(h,g,f){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[h,g,f]))},ne:function(h,g,f){return d.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[h,g,f]))},nw:function(h,g,f){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[h,g,f]))}},_propagate:function(g,f){d.ui.plugin.call(this,g,[f,this.ui()]);(g!="resize"&&this._trigger(g,f,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable,{version:"@VERSION"});d.ui.plugin.add("resizable","alsoResize",{start:function(g,h){var f=d(this).data("resizable"),j=f.options;var i=function(k){d(k).each(function(){var l=d(this);l.data("resizable-alsoresize",{width:parseInt(l.width(),10),height:parseInt(l.height(),10),left:parseInt(l.css("left"),10),top:parseInt(l.css("top"),10)})})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.parentNode){if(j.alsoResize.length){j.alsoResize=j.alsoResize[0];i(j.alsoResize)}else{d.each(j.alsoResize,function(k){i(k)})}}else{i(j.alsoResize)}},resize:function(h,j){var g=d(this).data("resizable"),k=g.options,i=g.originalSize,m=g.originalPosition;var l={height:(g.size.height-i.height)||0,width:(g.size.width-i.width)||0,top:(g.position.top-m.top)||0,left:(g.position.left-m.left)||0},f=function(n,o){d(n).each(function(){var r=d(this),s=d(this).data("resizable-alsoresize"),q={},p=o&&o.length?o:r.parents(j.originalElement[0]).length?["width","height"]:["width","height","top","left"];d.each(p,function(t,v){var u=(s[v]||0)+(l[v]||0);if(u&&u>=0){q[v]=u||null}});r.css(q)})};if(typeof(k.alsoResize)=="object"&&!k.alsoResize.nodeType){d.each(k.alsoResize,function(n,o){f(n,o)})}else{f(k.alsoResize)}},stop:function(f,g){d(this).removeData("resizable-alsoresize")}});d.ui.plugin.add("resizable","animate",{stop:function(j,p){var q=d(this).data("resizable"),k=q.options;var i=q._proportionallyResizeElements,f=i.length&&(/textarea/i).test(i[0].nodeName),g=f&&d.ui.hasScroll(i[0],"left")?0:q.sizeDiff.height,m=f?0:q.sizeDiff.width;var h={width:(q.size.width-m),height:(q.size.height-g)},l=(parseInt(q.element.css("left"),10)+(q.position.left-q.originalPosition.left))||null,n=(parseInt(q.element.css("top"),10)+(q.position.top-q.originalPosition.top))||null;q.element.animate(d.extend(h,n&&l?{top:n,left:l}:{}),{duration:k.animateDuration,easing:k.animateEasing,step:function(){var o={width:parseInt(q.element.css("width"),10),height:parseInt(q.element.css("height"),10),top:parseInt(q.element.css("top"),10),left:parseInt(q.element.css("left"),10)};if(i&&i.length){d(i[0]).css({width:o.width,height:o.height})}q._updateCache(o);q._propagate("resize",j)}})}});d.ui.plugin.add("resizable","containment",{start:function(g,s){var u=d(this).data("resizable"),k=u.options,m=u.element;var h=k.containment,l=(h instanceof d)?h.get(0):(/parent/.test(h))?m.parent().get(0):h;if(!l){return}u.containerElement=d(l);if(/document/.test(h)||h==document){u.containerOffset={left:0,top:0};u.containerPosition={left:0,top:0};u.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var q=d(l),j=[];d(["Top","Right","Left","Bottom"]).each(function(p,o){j[p]=c(q.css("padding"+o))});u.containerOffset=q.offset();u.containerPosition=q.position();u.containerSize={height:(q.innerHeight()-j[3]),width:(q.innerWidth()-j[1])};var r=u.containerOffset,f=u.containerSize.height,n=u.containerSize.width,i=(d.ui.hasScroll(l,"left")?l.scrollWidth:n),t=(d.ui.hasScroll(l)?l.scrollHeight:f);u.parentData={element:l,left:r.left,top:r.top,width:i,height:t}}},resize:function(h,r){var u=d(this).data("resizable"),j=u.options,g=u.containerSize,q=u.containerOffset,n=u.size,p=u.position,s=u._aspectRatio||h.shiftKey,f={top:0,left:0},i=u.containerElement;if(i[0]!=document&&(/static/).test(i.css("position"))){f=q}if(p.left<(u._helper?q.left:0)){u.size.width=u.size.width+(u._helper?(u.position.left-q.left):(u.position.left-f.left));if(s){u.size.height=u.size.width/u.aspectRatio}u.position.left=j.helper?q.left:0}if(p.top<(u._helper?q.top:0)){u.size.height=u.size.height+(u._helper?(u.position.top-q.top):u.position.top);if(s){u.size.width=u.size.height*u.aspectRatio}u.position.top=u._helper?q.top:0}u.offset.left=u.parentData.left+u.position.left;u.offset.top=u.parentData.top+u.position.top;var m=Math.abs((u._helper?u.offset.left-f.left:(u.offset.left-f.left))+u.sizeDiff.width),t=Math.abs((u._helper?u.offset.top-f.top:(u.offset.top-q.top))+u.sizeDiff.height);var l=u.containerElement.get(0)==u.element.parent().get(0),k=/relative|absolute/.test(u.containerElement.css("position"));if(l&&k){m-=u.parentData.left}if(m+u.size.width>=u.parentData.width){u.size.width=u.parentData.width-m;if(s){u.size.height=u.size.width/u.aspectRatio}}if(t+u.size.height>=u.parentData.height){u.size.height=u.parentData.height-t;if(s){u.size.width=u.size.height*u.aspectRatio}}},stop:function(g,p){var r=d(this).data("resizable"),i=r.options,m=r.position,n=r.containerOffset,f=r.containerPosition,j=r.containerElement;var k=d(r.helper),s=k.offset(),q=k.outerWidth()-r.sizeDiff.width,l=k.outerHeight()-r.sizeDiff.height;if(r._helper&&!i.animate&&(/relative/).test(j.css("position"))){d(this).css({left:s.left-f.left-n.left,width:q,height:l})}if(r._helper&&!i.animate&&(/static/).test(j.css("position"))){d(this).css({left:s.left-f.left-n.left,width:q,height:l})}}});d.ui.plugin.add("resizable","ghost",{start:function(h,i){var f=d(this).data("resizable"),j=f.options,g=f.size;f.ghost=f.originalElement.clone();f.ghost.css({opacity:0.25,display:"block",position:"relative",height:g.height,width:g.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof j.ghost=="string"?j.ghost:"");f.ghost.appendTo(f.helper)},resize:function(g,h){var f=d(this).data("resizable"),i=f.options;if(f.ghost){f.ghost.css({position:"relative",height:f.size.height,width:f.size.width})}},stop:function(g,h){var f=d(this).data("resizable"),i=f.options;if(f.ghost&&f.helper){f.helper.get(0).removeChild(f.ghost.get(0))}}});d.ui.plugin.add("resizable","grid",{resize:function(f,n){var q=d(this).data("resizable"),i=q.options,l=q.size,j=q.originalSize,k=q.originalPosition,p=q.axis,m=i._aspectRatio||f.shiftKey;i.grid=typeof i.grid=="number"?[i.grid,i.grid]:i.grid;var h=Math.round((l.width-j.width)/(i.grid[0]||1))*(i.grid[0]||1),g=Math.round((l.height-j.height)/(i.grid[1]||1))*(i.grid[1]||1);if(/^(se|s|e)$/.test(p)){q.size.width=j.width+h;q.size.height=j.height+g}else{if(/^(ne)$/.test(p)){q.size.width=j.width+h;q.size.height=j.height+g;q.position.top=k.top-g}else{if(/^(sw)$/.test(p)){q.size.width=j.width+h;q.size.height=j.height+g;q.position.left=k.left-h}else{q.size.width=j.width+h;q.size.height=j.height+g;q.position.top=k.top-g;q.position.left=k.left-h}}}}});var c=function(f){return parseInt(f,10)||0};var b=function(f){return !isNaN(parseInt(f,10))}})(jQuery);(function($,undefined){$.extend($.ui,{datepicker:{version:"@VERSION"}});var PROP_NAME="datepicker";var dpuuid=new Date().getTime();var instActive;function Datepicker(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._datepickerShowing=false;this._inDialog=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass="ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};$.extend(this._defaults,this.regional[""]);this.dpDiv=bindHover($('
        '))}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){if(this.debug){console.log.apply("",arguments)}},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){this.uuid+=1;target.id="dp"+this.uuid}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:bindHover($('
        ')))}},_connectDatepicker:function(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return}this._attachments(input,inst);input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});this._autoSize(inst);$.data(target,PROP_NAME,inst);if(inst.settings.disabled){this._disableDatepicker(target)}},_attachments:function(input,inst){var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(inst.append){inst.append.remove()}if(appendText){inst.append=$(''+appendText+"");input[isRTL?"before":"after"](inst.append)}input.unbind("focus",this._showDatepicker);if(inst.trigger){inst.trigger.remove()}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");inst.trigger=$(this._get(inst,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](inst.trigger);inst.trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==input[0]){$.datepicker._hideDatepicker()}else{if($.datepicker._datepickerShowing&&$.datepicker._lastInput!=input[0]){$.datepicker._hideDatepicker();$.datepicker._showDatepicker(input[0])}else{$.datepicker._showDatepicker(input[0])}}return false})}},_autoSize:function(inst){if(this._get(inst,"autoSize")&&!inst.inline){var date=new Date(2009,12-1,20);var dateFormat=this._get(inst,"dateFormat");if(dateFormat.match(/[DM]/)){var findMax=function(names){var max=0;var maxI=0;for(var i=0;imax){max=names[i].length;maxI=i}}return maxI};date.setMonth(findMax(this._get(inst,(dateFormat.match(/MM/)?"monthNames":"monthNamesShort"))));date.setDate(findMax(this._get(inst,(dateFormat.match(/DD/)?"dayNames":"dayNamesShort")))+20-date.getDay())}inst.input.attr("size",this._formatDate(inst,date).length)}},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst),true);this._updateDatepicker(inst);this._updateAlternate(inst);if(inst.settings.disabled){this._disableDatepicker(target)}inst.dpDiv.css("display","block")},_dialogDatepicker:function(input,date,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){this.uuid+=1;var id="dp"+this.uuid;this._dialogInput=$('');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});date=(date&&date.constructor==Date?this._formatDate(inst,date):date);this._dialogInput.val(date);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=document.documentElement.clientWidth;var browserHeight=document.documentElement.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",(this._pos[0]+20)+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;inst.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled");inline.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;inst.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled");inline.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i-1)}},_doKeyUp:function(event){var inst=$.datepicker._getInst(event.target);if(inst.input.val()!=inst.lastVal){try{var date=$.datepicker.parseDate($.datepicker._get(inst,"dateFormat"),(inst.input?inst.input.val():null),$.datepicker._getFormatConfig(inst));if(date){$.datepicker._setDateFromField(inst);$.datepicker._updateAlternate(inst);$.datepicker._updateDatepicker(inst)}}catch(err){$.datepicker.log(err)}}return true},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);if($.datepicker._curInst&&$.datepicker._curInst!=inst){$.datepicker._curInst.dpDiv.stop(true,true);if(inst&&$.datepicker._datepickerShowing){$.datepicker._hideDatepicker($.datepicker._curInst.input[0])}}var beforeShow=$.datepicker._get(inst,"beforeShow");var beforeShowSettings=beforeShow?beforeShow.apply(input,[input,inst]):{};if(beforeShowSettings===false){return}extendRemove(inst.settings,beforeShowSettings);inst.lastVal=null;$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.dpDiv.empty();inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim");var duration=$.datepicker._get(inst,"duration");var postProcess=function(){var cover=inst.dpDiv.find("iframe.ui-datepicker-cover");if(!!cover.length){var borders=$.datepicker._getBorders(inst.dpDiv);cover.css({left:-borders[0],top:-borders[1],width:inst.dpDiv.outerWidth(),height:inst.dpDiv.outerHeight()})}};inst.dpDiv.zIndex($(input).zIndex()+1);$.datepicker._datepickerShowing=true;if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim||"show"]((showAnim?duration:null),postProcess)}if(!showAnim||!duration){postProcess()}if(inst.input.is(":visible")&&!inst.input.is(":disabled")){inst.input.focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var self=this;self.maxRows=4;var borders=$.datepicker._getBorders(inst.dpDiv);instActive=inst;inst.dpDiv.empty().append(this._generateHTML(inst));this._attachHandlers(inst);var cover=inst.dpDiv.find("iframe.ui-datepicker-cover");if(!!cover.length){cover.css({left:-borders[0],top:-borders[1],width:inst.dpDiv.outerWidth(),height:inst.dpDiv.outerHeight()})}inst.dpDiv.find("."+this._dayOverClass+" a").mouseover();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst==$.datepicker._curInst&&$.datepicker._datepickerShowing&&inst.input&&inst.input.is(":visible")&&!inst.input.is(":disabled")&&inst.input[0]!=document.activeElement){inst.input.focus()}if(inst.yearshtml){var origyearshtml=inst.yearshtml;setTimeout(function(){if(origyearshtml===inst.yearshtml&&inst.yearshtml){inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml)}origyearshtml=inst.yearshtml=null},0)}},_getBorders:function(elem){var convert=function(value){return{thin:1,medium:2,thick:3}[value]||value};return[parseFloat(convert(elem.css("border-left-width"))),parseFloat(convert(elem.css("border-top-width")))]},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=document.documentElement.clientWidth+(isFixed?0:$(document).scrollLeft());var viewHeight=document.documentElement.clientHeight+(isFixed?0:$(document).scrollTop());offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=Math.min(offset.left,(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0);offset.top-=Math.min(offset.top,(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(dpHeight+inputHeight):0);return offset},_findPos:function(obj){var inst=this._getInst(obj);var isRTL=this._get(inst,"isRTL");while(obj&&(obj.type=="hidden"||obj.nodeType!=1||$.expr.filters.hidden(obj))){obj=obj[isRTL?"previousSibling":"nextSibling"]}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(this._datepickerShowing){var showAnim=this._get(inst,"showAnim");var duration=this._get(inst,"duration");var postProcess=function(){$.datepicker._tidyDialog(inst)};if($.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide"))]((showAnim?duration:null),postProcess)}if(!showAnim){postProcess()}this._datepickerShowing=false;var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target),inst=$.datepicker._getInst($target[0]);if((($target[0].id!=$.datepicker._mainDivId&&$target.parents("#"+$.datepicker._mainDivId).length==0&&!$target.hasClass($.datepicker.markerClassName)&&!$target.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)))||($target.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=inst)){$.datepicker._hideDatepicker()}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{this._hideDatepicker();this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input.focus()}this._lastInput=null}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);var dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getTime());checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();checkDate.setMonth(0);checkDate.setDate(1);return Math.floor(Math.round((time-checkDate)/86400000)/7)+1},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var doy=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(((1970-1)*365+Math.floor(1970/4)-Math.floor(1970/100)+Math.floor(1970/400))*24*60*60*10000000),formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+112?date.getHours()+2:0);return date},_setDate:function(inst,date,noChange){var clear=!date;var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;var newDate=this._restrictMinMax(inst,this._determineDate(inst,date,new Date()));inst.selectedDay=inst.currentDay=newDate.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=newDate.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=newDate.getFullYear();if((origMonth!=inst.selectedMonth||origYear!=inst.selectedYear)&&!noChange){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_attachHandlers:function(inst){var stepMonths=this._get(inst,"stepMonths");var id="#"+inst.id.replace(/\\\\/g,"\\");inst.dpDiv.find("[data-handler]").map(function(){var handler={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(id,-stepMonths,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(id,+stepMonths,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(id)},selectDay:function(){window["DP_jQuery_"+dpuuid].datepicker._selectDay(id,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this);return false},selectMonth:function(){window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(id,this,"M");return false},selectYear:function(){window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(id,this,"Y");return false}};$(this).bind(this.getAttribute("data-event"),handler[this.getAttribute("data-handler")])})},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-(numMonths[0]*numMonths[1])+1,maxDate.getDate()));maxDraw=(minDate&&maxDrawmaxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?''+prevText+"":(hideIfNoPrevNext?"":''+prevText+""));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?''+nextText+"":(hideIfNoPrevNext?"":''+nextText+""));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'":"");var otherButton=this._get(inst,"otherButton");var otherButtonHtml=(typeof(otherButton)=="undefined")?"":'";var buttonPanel=(showButtonPanel)?'
        '+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'":"")+otherButtonHtml+(isRTL?"":controls)+"
        ":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var showWeek=this._get(inst,"showWeek");var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var selectOtherMonths=this._get(inst,"selectOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row1){switch(col){case 0:calender+=" ui-datepicker-group-first";cornerClass=" ui-corner-"+(isRTL?"right":"left");break;case numMonths[1]-1:calender+=" ui-datepicker-group-last";cornerClass=" ui-corner-"+(isRTL?"left":"right");break;default:calender+=" ui-datepicker-group-middle";cornerClass="";break}}calender+='">'}calender+='
        '+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,row>0||col>0,monthNames,monthNamesShort)+'
        ';var thead=(showWeek?'":"");for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="=5?' class="ui-datepicker-week-end"':"")+'>'+dayNamesMin[day]+""}calender+=thead+"";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var curRows=Math.ceil((leadDays+daysInMonth)/7);var numRows=(isMultiMonth?this.maxRows>curRows?this.maxRows:curRows:curRows);this.maxRows=numRows;var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow";var tbody=(!showWeek?"":'");for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=(otherMonth&&!selectOtherMonths)||!daySettings[0]||(minDate&&printDatemaxDate);tbody+='";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+""}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="
        '+this._get(inst,"weekHeader")+"
        '+this._get(inst,"calculateWeek")(printDate)+""+(otherMonth&&!showOtherMonths?" ":(unselectable?''+printDate.getDate()+"":''+printDate.getDate()+""))+"
        "+(isMultiMonth?"
        "+((numMonths[0]>0&&col==numMonths[1]-1)?'
        ':""):"");group+=calender}html+=group}html+=buttonPanel+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,secondary,monthNames,monthNamesShort){var changeMonth=this._get(inst,"changeMonth");var changeYear=this._get(inst,"changeYear");var showMonthAfterYear=this._get(inst,"showMonthAfterYear");var html='
        ';var monthHtml="";if(secondary||!changeMonth){monthHtml+=''+monthNames[drawMonth]+""}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='"}if(!showMonthAfterYear){html+=monthHtml+(secondary||!(changeMonth&&changeYear)?" ":"")}if(!inst.yearshtml){inst.yearshtml="";if(secondary||!changeYear){html+=''+drawYear+""}else{var years=this._get(inst,"yearRange").split(":");var thisYear=new Date().getFullYear();var determineYear=function(value){var year=(value.match(/c[+-].*/)?drawYear+parseInt(value.substring(1),10):(value.match(/[+-].*/)?thisYear+parseInt(value,10):parseInt(value,10)));return(isNaN(year)?thisYear:year)};var year=determineYear(years[0]);var endYear=Math.max(year,determineYear(years[1]||""));year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);inst.yearshtml+='";html+=inst.yearshtml;inst.yearshtml=null}}html+=this._get(inst,"yearSuffix");if(showMonthAfterYear){html+=(secondary||!(changeMonth&&changeYear)?" ":"")+monthHtml}html+="
        ";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._restrictMinMax(inst,this._daylightSavingAdjust(new Date(year,month,day)));inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_restrictMinMax:function(inst,date){var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");var newDate=(minDate&&datemaxDate?maxDate:newDate);return newDate},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax){return this._determineDate(inst,this._get(inst,minMax+"Date"),null)},_getDaysInMonth:function(year,month){return 32-this._daylightSavingAdjust(new Date(year,month,32)).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[0]*numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date.getTime()>=minDate.getTime())&&(!maxDate||date.getTime()<=maxDate.getTime()))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function bindHover(dpDiv){var selector="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return dpDiv.bind("mouseout",function(event){var elem=$(event.target).closest(selector);if(!elem.length){return}elem.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(event){var elem=$(event.target).closest(selector);if($.datepicker._isDisabledDatepicker(instActive.inline?dpDiv.parent()[0]:instActive.input[0])||!elem.length){return}elem.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");elem.addClass("ui-state-hover");if(elem.hasClass("ui-datepicker-prev")){elem.addClass("ui-datepicker-prev-hover")}if(elem.hasClass("ui-datepicker-next")){elem.addClass("ui-datepicker-next-hover")}})}function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!this.length){return this}if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate"||options=="widget")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}if(options=="option"&&arguments.length==2&&typeof arguments[1]=="string"){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="@VERSION";window["DP_jQuery_"+dpuuid]=$})(jQuery);jQuery(function(b){b.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:false,showMonthAfterYear:true,yearSuffix:"年"};b.datepicker.setDefaults(b.datepicker.regional["zh-CN"])});(function(b,c){b.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var e=this.options,d=e.accept;this.isover=0;this.isout=1;this.accept=b.isFunction(d)?d:function(f){return f.is(d)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};b.ui.ddmanager.droppables[e.scope]=b.ui.ddmanager.droppables[e.scope]||[];b.ui.ddmanager.droppables[e.scope].push(this);(e.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var d=b.ui.ddmanager.droppables[this.options.scope];for(var e=0;e=q&&o<=m)||(n>=q&&n<=m)||(om))&&((f>=h&&f<=d)||(e>=h&&e<=d)||(fd));break;default:return false;break}};b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(g,k){var d=b.ui.ddmanager.droppables[g.options.scope]||[];var h=k?k.type:null;var l=(g.currentItem||g.element).find(":data(droppable)").andSelf();droppablesLoop:for(var f=0;f
        ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(true)},_setOption:function(h,i){if(h=="selected"){if(this.options.collapsible&&i==this.options.selected){return}this.select(i)}else{this.options[h]=i;this._tabify()}},_tabId:function(h){return h.title&&h.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+f()},_sanitizeSelector:function(h){return h.replace(/:/g,"\\:")},_cookie:function(){var h=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+b());return e.cookie.apply(null,[h].concat(e.makeArray(arguments)))},_ui:function(i,h){return{tab:i,panel:h,index:this.anchors.index(i)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var h=e(this);h.html(h.data("label.tabs")).removeData("label.tabs")})},_tabify:function(u){var v=this,k=this.options,j=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=e(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return e("a",this)[0]});this.panels=e([]);this.anchors.each(function(x,o){var w=e(o).attr("href");var y=w.split("#")[0],z;if(y&&(y===location.toString().split("#")[0]||(z=e("base")[0])&&y===z.href)){w=o.hash;o.href=w}if(j.test(w)){v.panels=v.panels.add(v.element.find(v._sanitizeSelector(w)))}else{if(w&&w!=="#"){e.data(o,"href.tabs",w);e.data(o,"load.tabs",w.replace(/#.*$/,""));var B=v._tabId(o);o.href="#"+B;var A=v.element.find("#"+B);if(!A.length){A=e(k.panelTemplate).attr("id",B).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(v.panels[x-1]||v.list);A.data("destroy.tabs",true)}v.panels=v.panels.add(A)}else{k.disabled.push(x)}}});if(u){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(k.selected===g){if(location.hash){this.anchors.each(function(w,o){if(o.hash==location.hash){k.selected=w;return false}})}if(typeof k.selected!=="number"&&k.cookie){k.selected=parseInt(v._cookie(),10)}if(typeof k.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length){k.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}k.selected=k.selected||(this.lis.length?0:-1)}else{if(k.selected===null){k.selected=-1}}k.selected=((k.selected>=0&&this.anchors[k.selected])||k.selected<0)?k.selected:0;k.disabled=e.unique(k.disabled.concat(e.map(this.lis.filter(".ui-state-disabled"),function(w,o){return v.lis.index(w)}))).sort();if(e.inArray(k.selected,k.disabled)!=-1){k.disabled.splice(e.inArray(k.selected,k.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(k.selected>=0&&this.anchors.length){v.element.find(v._sanitizeSelector(v.anchors[k.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(k.selected).addClass("ui-tabs-selected ui-state-active");v.element.queue("tabs",function(){v._trigger("show",null,v._ui(v.anchors[k.selected],v.element.find(v._sanitizeSelector(v.anchors[k.selected].hash))[0]))});this.load(k.selected)}e(window).bind("unload",function(){v.lis.add(v.anchors).unbind(".tabs");v.lis=v.anchors=v.panels=null})}else{k.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[k.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(k.cookie){this._cookie(k.selected,k.cookie)}for(var n=0,t;(t=this.lis[n]);n++){e(t)[e.inArray(n,k.disabled)!=-1&&!e(t).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(k.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(k.event!=="mouseover"){var m=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var q=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){m("hover",e(this))});this.lis.bind("mouseout.tabs",function(){q("hover",e(this))});this.anchors.bind("focus.tabs",function(){m("focus",e(this).closest("li"))});this.anchors.bind("blur.tabs",function(){q("focus",e(this).closest("li"))})}var h,p;if(k.fx){if(e.isArray(k.fx)){h=k.fx[0];p=k.fx[1]}else{h=p=k.fx}}function l(i,o){i.css("display","");if(!e.support.opacity&&o.opacity){i[0].style.removeAttribute("filter")}}var r=p?function(i,o){e(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(p,p.duration||"normal",function(){l(o,p);v._trigger("show",null,v._ui(i,o[0]))})}:function(i,o){e(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");v._trigger("show",null,v._ui(i,o[0]))};var s=h?function(o,i){i.animate(h,h.duration||"normal",function(){v.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");l(i,h);v.element.dequeue("tabs")})}:function(o,i,w){v.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");v.element.dequeue("tabs")};this.anchors.bind(k.event+".tabs",function(){var o=this,x=e(o).closest("li"),i=v.panels.filter(":not(.ui-tabs-hide)"),w=v.element.find(v._sanitizeSelector(o.hash));if((x.hasClass("ui-tabs-selected")&&!k.collapsible)||x.hasClass("ui-state-disabled")||x.hasClass("ui-state-processing")||v.panels.filter(":animated").length||v._trigger("select",null,v._ui(this,w[0]))===false){this.blur();return false}k.selected=v.anchors.index(this);v.abort();if(k.collapsible){if(x.hasClass("ui-tabs-selected")){k.selected=-1;if(k.cookie){v._cookie(k.selected,k.cookie)}v.element.queue("tabs",function(){s(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(k.cookie){v._cookie(k.selected,k.cookie)}v.element.queue("tabs",function(){r(o,w)});v.load(v.anchors.index(this));this.blur();return false}}}if(k.cookie){v._cookie(k.selected,k.cookie)}if(w.length){if(i.length){v.element.queue("tabs",function(){s(o,i)})}v.element.queue("tabs",function(){r(o,w)});v.load(v.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(e.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(h){if(typeof h=="string"){h=this.anchors.index(this.anchors.filter("[href$='"+h+"']"))}return h},destroy:function(){var h=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var i=e.data(this,"href.tabs");if(i){this.href=i}var j=e(this).unbind(".tabs");e.each(["href","load","cache"],function(k,l){j.removeData(l+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(e.data(this,"destroy.tabs")){e(this).remove()}else{e(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(h.cookie){this._cookie(null,h.cookie)}return this},add:function(k,j,i){if(i===g){i=this.anchors.length}var h=this,m=this.options,p=e(m.tabTemplate.replace(/#\{href\}/g,k).replace(/#\{label\}/g,j)),n=!k.indexOf("#")?k.replace("#",""):this._tabId(e("a",p)[0]);p.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var l=h.element.find("#"+n);if(!l.length){l=e(m.panelTemplate).attr("id",n).data("destroy.tabs",true)}l.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(i>=this.lis.length){p.appendTo(this.list);l.appendTo(this.list[0].parentNode)}else{p.insertBefore(this.lis[i]);l.insertBefore(this.panels[i])}m.disabled=e.map(m.disabled,function(q,o){return q>=i?++q:q});this._tabify();if(this.anchors.length==1){m.selected=0;p.addClass("ui-tabs-selected ui-state-active");l.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){h._trigger("show",null,h._ui(h.anchors[0],h.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[i],this.panels[i]));return this},remove:function(h){h=this._getIndex(h);var j=this.options,k=this.lis.eq(h).remove(),i=this.panels.eq(h).remove();if(k.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(h+(h+1=h?--m:m});this._tabify();this._trigger("remove",null,this._ui(k.find("a")[0],i[0]));return this},enable:function(h){h=this._getIndex(h);var i=this.options;if(e.inArray(h,i.disabled)==-1){return}this.lis.eq(h).removeClass("ui-state-disabled");i.disabled=e.grep(i.disabled,function(k,j){return k!=h});this._trigger("enable",null,this._ui(this.anchors[h],this.panels[h]));return this},disable:function(i){i=this._getIndex(i);var h=this,j=this.options;if(i!=j.selected){this.lis.eq(i).addClass("ui-state-disabled");j.disabled.push(i);j.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[i],this.panels[i]))}return this},select:function(h){h=this._getIndex(h);if(h==-1){if(this.options.collapsible&&this.options.selected!=-1){h=this.options.selected}else{return this}}this.anchors.eq(h).trigger(this.options.event+".tabs");return this},load:function(k){k=this._getIndex(k);var i=this,m=this.options,h=this.anchors.eq(k)[0],j=e.data(h,"load.tabs");this.abort();if(!j||this.element.queue("tabs").length!==0&&e.data(h,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(k).addClass("ui-state-processing");if(m.spinner){var l=e("span",h);l.data("label.tabs",l.html()).html(m.spinner)}this.xhr=e.ajax(e.extend({},m.ajaxOptions,{url:j,success:function(o,n){i.element.find(i._sanitizeSelector(h.hash)).html(o);i._cleanup();if(m.cache){e.data(h,"cache.tabs",true)}i._trigger("load",null,i._ui(i.anchors[k],i.panels[k]));try{m.ajaxOptions.success(o,n)}catch(p){}},error:function(p,n,o){i._cleanup();i._trigger("load",null,i._ui(i.anchors[k],i.panels[k]));try{m.ajaxOptions.error(p,n,k,h)}catch(o){}}}));i.element.dequeue("tabs");return this},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(i,h){this.anchors.eq(i).removeData("cache.tabs").data("load.tabs",h);return this},length:function(){return this.anchors.length}});e.extend(e.ui.tabs,{version:"@VERSION"});e.extend(e.ui.tabs.prototype,{rotation:null,rotate:function(j,l){var h=this,m=this.options;var i=h._rotate||(h._rotate=function(n){clearTimeout(h.rotation);h.rotation=setTimeout(function(){var o=m.selected;h.select(++o li"),i=-1,h=false,m=false,o=0;b.data(n[0],"marquee",p);this.pause=function(){h=true;q()};this.resume=function(){h=false;e()};this.update=function(){var s=g.length;g=n.find("> li");if(s<=1){e()}};function l(s){if(g.filter("."+r.cssShowing).length>0){return false}var u=g.eq(s);if(b.isFunction(r.beforeshow)){r.beforeshow.apply(p,[n,u])}var t={top:(r.yScroll=="top"?"-":"+")+u.outerHeight()+"px",left:0};n.data("marquee.showing",true);u.addClass(r.cssShowing);u.css(t).animate({top:"0px"},r.showSpeed,r.fxEasingShow,function(){if(b.isFunction(r.show)){r.show.apply(p,[n,u])}n.data("marquee.showing",false);k(u)})}function k(t,s){if(m==true){return false}s=s||r.pauseSpeed;if(d(t)){setTimeout(function(){if(m==true){return false}var w=t.outerWidth(),u=w*-1,v=parseInt(t.css("left"),10);t.animate({left:u+"px"},((w+v)*r.scrollSpeed),r.fxEasingScroll,function(){j(t)})},s)}else{if(g.length>1){if(n.data("timeout")){clearTimeout(n.data("timeout"))}if(!n.data("_innerHeight")){n.data("_innerHeight",n.innerHeight())}n.data("timeout",setTimeout(function(){if(m==true){return false}t.animate({top:(r.yScroll=="top"?"+":"-")+n.data("_innerHeight")+"px"},r.showSpeed,r.fxEasingScroll);j(t)},s))}}}function j(s){if(b.isFunction(r.aftershow)){r.aftershow.apply(p,[n,s])}s.removeClass(r.cssShowing);if(r.hoverChange){n.append(s)}c()}function q(){m=true;if(n.data("marquee.showing")!=true){g.filter("."+r.cssShowing).dequeue().stop()}if(r.hoverChange&&g.length>1){n.removeClass("marquee").addClass("unfoldMarquee");var s=b("
        ").attr("id","g_top_leftTopCover").addClass("g_topBar_marquee_cover");var t=b("
        ").attr("id","g_top_rightTopCover").addClass("g_topBar_marquee_cover");b("body").append(s);s.offset({top:n.offset().top-1,left:n.offset().left});b("body").append(t);t.offset({top:n.offset().top-1,left:(n.offset().left+n.width()-1)})}}function e(){m=false;if(n.data("marquee.showing")!=true){k(g.filter("."+r.cssShowing),1)}if(r.hoverChange){n.removeClass("unfoldMarquee").addClass("marquee");b("#g_top_leftTopCover").remove();b("#g_top_rightTopCover").remove()}}if(r.pauseOnHover){n.hover(function(){if(h){return false}q()},function(){if(h){return false}e()})}function d(s){return(s.outerWidth()>n.innerWidth())}function c(){i++;if(i>=g.length){if(!isNaN(r.loop)&&r.loop>0&&(++o>=r.loop)){return false}i=0}l(i)}if(b.isFunction(r.init)){r.init.apply(p,[n,r])}c()};b.Marquee.defaults={yScroll:"top",showSpeed:850,scrollSpeed:12,pauseSpeed:5000,pauseOnHover:true,loop:-1,fxEasingShow:"swing",fxEasingScroll:"linear",cssShowing:"marquee-showing",init:null,beforeshow:null,show:null,aftershow:null,hoverChange:false}})(jQuery);(function(b){jQuery.fn.extend({imageSwitch:function(d){if(typeof Fai=="undefined"){alert("must import fai.js");return}var c=b.extend({title:true,desc:false,btn:true,repeat:"no-repeat",position:"50% 50%",titleSize:14,titleFont:"Verdana,宋体",titleColor:"#FFF",titleTop:4,titleLeft:4,descSize:12,descFont:"Verdana,宋体",descColor:"#FFF",descTop:2,descLeft:4,btnWidth:15,btnHeight:15,btnMargin:4,btnType:1,playTime:4000,animateTime:1500,animateStyle:"o",index:0,from:"module",btnFunc:function(){}},d);return b(this).each(function(){var A=b(this);var E=c.width||A.width();var g=c.height||A.height();var J=c.data.length;var e=c.index;var F=E').appendTo(A).css("position","absolute").css("display","none").css("zIndex",2).css("width",b.browser.msie&&b.browser.version==6?b(A).parent().parent().width()+"px":b(A).parent().width()+"px").css("height",30+"px").css("line-height",30+"px");if(J==0){s.css("visibility","hidden")}if(c.showImageName){s.css("display","block")}var v="none";if(c.data.length>1){v=c.btn?"block":"none"}if(c.btnType!=0){var C=b('
        ').appendTo(A).css("position","absolute").css("zIndex",3).css("display",v)}b("
        ").appendTo(A);var h=b('
        ').appendTo(A).css("width",(c.width<=A.width())?c.width:"100%").css("position","relative").height("y,show-y".indexOf(c.animateStyle)!=-1?g*J:g).css("overflow","hidden");var u=0;var q="100%";if(c.btnType==0){c.animateStyle="x"}b.each(c.data,function(N,Q){var L="onclick='";if(Q.click!=null){L+=Q.click}var P="";if(!Q.href){L+="return false;"}L+="'";var M=b('").appendTo(h).css("width",q).css("height",g+"px").attr("href",Q.href?Q.href:"javascript:;").attr("target",Q.target?Q.target:"").attr("title",Q.tip?Q.tip:"").css("cursor",Q.href?"pointer":"default").css("background-position",c.position).css("background-repeat",c.repeat).css("overflow","hidden").css("display","block").css("float","x,show-x".indexOf(c.animateStyle)!=-1?"left":"");if(Q.width&&Q.width>0){M.html("")}else{M.css("background-image","url("+Q.src+")")}if(c.btnType==1){var O=b('').appendTo(C).html(""+(N+1)+"")}else{if(c.btnType==2){var O=b('').appendTo(C)}}var K=b('').appendTo(s).css("margin-left",10+"px").text(Q.name);if(c.btnType!=0){if(N==e){if(c.btnType==1){O.addClass("imageSwitchBtnSel")}else{O.addClass("imageSwitchBtnSel_dot")}K.addClass("spanShowName")}}if(c.btnType==1){u+=Fai.getDivWidth(O)}});if(c.btnType==0){if(J>1){var D=b('').appendTo(A).css("position","absolute").css("zIndex",3);var i=b('').appendTo(A).css("position","absolute").css("zIndex",3)}}else{}if(c.btnType==1){C.width(u)}var p=A.parent();var t=p.width();if(b.browser.msie&&b.browser.version==6){t=p.parent().width()}var f=p.height();if(c.from=="module"){if(t>c.width){t=c.width}}else{if(t>c.width){t=c.width+(t-c.width)/2}if(t>A.width()){t=A.width()}}if(f>g){f=g}if(J>1){if(c.btnType!=0){if(Fai.top.$("#banner").length>0){if(c.btnType==1){if(E>=A.width()){C.css("right","0px")}else{C.css("right","50%");C.css("marginRight","-"+E/2+"px")}}else{if(c.btnType==2){C.css("left","50%");C.css("marginLeft","-"+C.width()/2+"px")}}}else{C.css("left",(t-u)+"px")}}else{var o=A.width()-E;if(E<=A.width()){o=o-o*0.5}else{o=0}D.css("left",o);i.css("right",o)}}if(c.btnType!=0){var r=C.children("a");var G=h.children("a")}else{var l=i;var k=D}var x=s.children("span");var z=t-u;if(J>1){if(c.btnType!=0){s.css("top",(f-C.height()-9)+"px").css("left",0+"px")}else{s.css("top",f+"px").css("left",0+"px")}var j=b.browser.msie&&b.browser.version==6?parseInt(m()+30):parseInt(m()+20);if(z>j){if(c.btnType==1){C.css("top",(f-C.height()-6)+"px")}else{if(c.btnType==2){C.css("bottom","5px")}else{D.css("top","50%");D.css("marginTop","-"+D.height()/2+"px");i.css("top","50%");i.css("marginTop","-"+i.height()/2+"px")}}}else{if(c.btnType==1){C.css("top",(f-C.height()-30)+"px")}else{if(c.btnType==2){C.css("bottom","5px")}else{D.css("top","50%");D.css("marginTop","-"+D.height()/2+"px");i.css("top","50%");i.css("marginTop","-"+i.height()/2+"px")}}}}function m(){if(x.length>0){var L=b(x[0]).width();for(var K=1;K1){if(c.btnType!=0){r.click(function(L){L.stopPropagation();var K=r.index(this);if(K==e){return}if(c.btnType==1){r.eq(e).removeClass("imageSwitchBtnSel");r.eq(K).addClass("imageSwitchBtnSel")}else{r.eq(e).removeClass("imageSwitchBtnSel_dot");r.eq(K).addClass("imageSwitchBtnSel_dot")}x.eq(e).removeClass("spanShowName");x.eq(K).addClass("spanShowName");switch(c.animateStyle){case"o":G.eq(e).fadeOut(c.animateTime,"failinear");G.eq(K).fadeIn(c.animateTime,"failinear");break;case"x":h.animate({marginLeft:-K*E},c.animateTime);break;case"y":h.animate({marginTop:-K*g},c.animateTime);break;case"show":case"show-x":case"show-y":G.eq(e).hide(c.animateTime);G.eq(K).show(c.animateTime);break;case"none":G.eq(e).hide();G.eq(K).show();break}e=K;var M=Fai.top.$("#bannerGetHref");if(M){M.css({width:c.data[K].imgWidth,left:(A.width()-c.data[K].imgWidth)/2+"px"});M.css({height:c.data[K].imgHeight,top:(A.height()-c.data[K].imgHeight)/2+"px"})}});function w(){r.eq((e+1)%J).click()}}else{var n=e;x.eq(n).addClass("spanShowName");function B(K){K.stopPropagation();if(Fai.top.$(".arrowImg").is(":animated")){return}Fai.stopInterval(I);x.eq(n).removeClass("spanShowName");if(n==J-1){n=-1}x.eq(++n).addClass("spanShowName");Fai.top.$("#arrowImg"+n).css({left:q});Fai.top.$(".arrowImg").animate({left:"-="+F},1000);var L=Fai.top.$("#bannerGetHref");if(L){L.css({width:c.data[n].imgWidth,left:(A.width()-c.data[n].imgWidth)/2+"px"});L.css({height:c.data[n].imgHeight,top:(A.height()-c.data[n].imgHeight)/2+"px"})}setTimeout(function(){Fai.startInterval(I)},300)}l.on("click",B);l.hover(function(){l.addClass("arrow_next_hover")},function(){l.removeClass("arrow_next_hover")});function y(K){K.stopPropagation();if(Fai.top.$(".arrowImg").is(":animated")){return}Fai.stopInterval(I);x.eq(n).removeClass("spanShowName");if(n==0){n=J}x.eq(--n).addClass("spanShowName");Fai.top.$("#arrowImg"+n).css({left:"-"+q});Fai.top.$(".arrowImg").animate({left:"+="+F},1000);var L=Fai.top.$("#bannerGetHref");if(L){L.css({width:c.data[n].imgWidth,left:(A.width()-c.data[n].imgWidth)/2+"px"});L.css({height:c.data[n].imgHeight,top:(A.height()-c.data[n].imgHeight)/2+"px"})}setTimeout(function(){Fai.startInterval(I)},300)}k.on("click",y);k.hover(function(){k.addClass("arrow_prev_hover")},function(){k.removeClass("arrow_prev_hover")});function H(){l.click()}}var I="imageSwitch"+Math.random();if(c.btnType!=0){Fai.addInterval(I,w,c.playTime)}else{Fai.addInterval(I,H,c.playTime)}Fai.startInterval(I);if(typeof c.mouseoverId!="undefined"){b(Fai.top.$(A).find("."+c.mouseoverId)[0]).mouseover(function(){Fai.stopInterval(I)});b(Fai.top.$(A).find("."+c.mouseoverId)[0]).mouseout(function(){Fai.startInterval(I)})}else{A.mouseover(function(){Fai.stopInterval(I)});A.mouseout(function(){Fai.startInterval(I)})}}})}})})(jQuery);(function($){$(document).ready(function(){});function format(str){for(var i=1;i
        ',w/3,(w/2)-(w/6))).find(":last").css("opacity",0.5)}},200);var ie6FixRemove=function(){if($ie6Fix!==null){$ie6Fix.remove();$ie6Fix=null}};this.removeBits=function(){if(lens){lens.remove();lens=null}if($tint){$tint.remove();$tint=null}if(softFocus){softFocus.remove();softFocus=null}ie6FixRemove();$(".cloud-zoom-loading",jWin.parent()).remove()};this.destroy=function(){jWin.data("zoom",null);if($mouseTrap){$mouseTrap.unbind();$mouseTrap.remove();$mouseTrap=null}if(zoomDiv){zoomDiv.remove();zoomDiv=null}this.removeBits()};this.fadedOut=function(){if(zoomDiv){zoomDiv.remove();zoomDiv=null}this.removeBits()};this.controlLoop=function(){if(lens){var x=(mx-sImg.offset().left-(cw*0.5))>>0;var y=(my-sImg.offset().top-(ch*0.5))>>0;if(x<0){x=0}else{if(x>(sImg.parent().outerWidth()-cw)){x=(sImg.parent().outerWidth()-cw)}}if(y<0){y=0}else{if(y>(sImg.parent().outerHeight()-ch)){y=(sImg.parent().outerHeight()-ch)}}lens.css({left:x,top:y});lens.css("background-position",(-x)+"px "+(-y)+"px");destU=(((x)/sImg.parent().outerWidth())*zoomImage.width)>>0;destV=(((y)/sImg.parent().outerHeight())*zoomImage.height)>>0;currU+=(destU-currU)/opts.smoothMove;currV+=(destV-currV)/opts.smoothMove;zoomDiv.css("background-position",(-(currU>>0)+"px ")+(-(currV>>0)+"px"))}controlTimer=setTimeout(function(){ctx.controlLoop()},30)};this.init2=function(img,id){filesLoaded++;if(id===1){zoomImage=img}if(filesLoaded===2){this.init()}};this.init=function(){$(".cloud-zoom-loading",jWin.parent()).remove();jWin.parent().find(".mousetrap").remove();var zoomImgWidth=opts.imageWidth;var zoomImgHeight=opts.imageHeight;$mouseTrap=jWin.parent().append(format("
        ",sImg.parent().outerWidth(),sImg.parent().outerHeight(),0,0)).find(":last");if(zoomImgHeight<=opts.maxHeight&&zoomImgWidth<=opts.maxWidth){return false}jWin.parent().find("img").bind("mousemove",this,function(event){mx=event.pageX;my=event.pageY;if($mouseTrap){$mouseTrap.mouseenter()}});jWin.parent().find("img").bind("mouseleave",this,function(event){clearTimeout(controlTimer);if(lens){lens.fadeOut(299)}if($tint){$tint.fadeOut(299)}if(softFocus){softFocus.fadeOut(299)}if(zoomDiv){zoomDiv.fadeOut(300,function(){ctx.fadedOut()})}return false});$mouseTrap.bind("mousemove",this,function(event){mx=event.pageX;my=event.pageY});$mouseTrap.bind("mouseleave",this,function(event){clearTimeout(controlTimer);if(lens){lens.fadeOut(299)}if($tint){$tint.fadeOut(299)}if(softFocus){softFocus.fadeOut(299)}if(zoomDiv){zoomDiv.fadeOut(300,function(){ctx.fadedOut()})}return false});$mouseTrap.bind("mouseenter",this,function(event){mx=event.pageX;my=event.pageY;zw=event.data;if(zoomDiv){zoomDiv.stop(true,false);zoomDiv.remove()}var xPos=opts.adjustX,yPos=opts.adjustY;var siw=sImg.parent().outerWidth();var sih=sImg.parent().outerHeight();var w=opts.zoomWidth;var h=opts.zoomHeight;if(opts.zoomWidth=="auto"){w=siw}if(opts.zoomHeight=="auto"){h=sih}var appendTo=jWin.parent();switch(opts.position){case"top":yPos-=h;break;case"right":xPos+=siw;break;case"bottom":yPos+=sih;break;case"left":xPos-=w;break;case"inside":w=siw;h=sih;break;default:appendTo=$("#"+opts.position);if(!appendTo.length){appendTo=jWin;xPos+=siw;yPos+=sih}else{w=appendTo.innerWidth();h=appendTo.innerHeight()}}zoomDiv=appendTo.append(format('',xPos,yPos,w,h,zoomImage.src)).find(":last");if(sImg.attr("title")&&opts.showTitle){zoomDiv.append(format('
        %0
        ',sImg.attr("title"))).find(":last").css("opacity",opts.titleOpacity)}zoomDiv.fadeIn(500);if(lens){lens.remove();lens=null}cw=(sImg.parent().outerWidth()/zoomImage.width)*zoomDiv.width();ch=(sImg.parent().outerHeight()/zoomImage.height)*zoomDiv.height();lens=jWin.append(format("",cw,ch)).find(":last");var noTrans=false;if(opts.tint){lens.css("background",'url("'+sImg.attr("src")+'")');$tint=jWin.append(format('
        ',sImg.parent().outerWidth(),sImg.parent().outerHeight(),opts.tint)).find(":last");$tint.css("opacity",opts.tintOpacity);noTrans=true;$tint.fadeIn(500)}if(opts.softFocus){lens.css("background",'url("'+sImg.attr("src")+'")');softFocus=jWin.append(format('
        ',sImg.parent().outerWidth()-2,sImg.parent().outerHeight()-2,opts.tint)).find(":last");softFocus.css("background",'url("'+sImg.attr("src")+'")');softFocus.css("opacity",0.5);noTrans=true;softFocus.fadeIn(500)}if(!noTrans){lens.css("opacity",opts.lensOpacity)}if(opts.position!=="inside"){lens.fadeIn(500)}zw.controlLoop();return})};img1=new Image();$(img1).load(function(){ctx.init2(this,0)});img1.src=sImg.attr("src");img2=new Image();$(img2).load(function(){ctx.init2(this,1)});img2.src=jWin.attr("href")}$.fn.CloudZoom=function(options){var settings={};settings=$.extend({},settings,options);try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}this.each(function(){var relOpts,opts;eval("var a = {"+$(this).attr("rel")+"}");relOpts=a;if($(this).is(".cloud-zoom")){$(this).css({position:"relative",display:"block"});$("img",$(this)).css({display:"block"});if($(this).parent().attr("id")!="wrap"){$(this).wrap('
        ')}opts=$.extend({},$.fn.CloudZoom.defaults,options);opts=$.extend({},opts,relOpts);$(this).data("zoom",new CloudZoom($(this),opts))}else{if($(this).is(".cloud-zoom-gallery")){opts=$.extend({},relOpts,options);$(this).data("relOpts",opts)}}});return this};function clickAndMouseoverEvent(event){event.data.parents("li").parent().children("li").removeClass("g_imgFrameHover");if(!event.data.parents("li").hasClass("g_imgFrameHover")){event.data.parents("li").addClass("g_imgFrameHover")}var data=event.data.data("relOpts");$("#"+data.useZoom).data("zoom").destroy();$("#"+data.useZoom).attr("href",event.data.attr("href"));zoomImgWidth=event.data.data("relOpts").imageWidth;zoomImgHeight=event.data.data("relOpts").imageHeight;$("#"+event.data.data("relOpts").useZoom).CloudZoom();return false}$.fn.CloudZoom.defaults={zoomWidth:"auto",zoomHeight:"auto",position:"right",tint:false,tintOpacity:0.5,lensOpacity:0.5,softFocus:false,smoothMove:3,showTitle:true,titleOpacity:0.5,adjustX:0,adjustY:0}})(jQuery);(function(b){if(typeof jQuery.widget==="undefined"){return}b.widget("ui.faiButton",{options:{},_create:function(){var g=this;var f=g.options;var e=g.element;var c=b(e).is(":button");if(c){var d=b(e).attr("extClass");if(typeof d!="undefined"&&d!=""){e.addClass(d).on("mouseenter",function(){b(this).addClass(d+"-hover")}).on("mouseleave",function(){b(this).removeClass(d+"-hover").removeClass(d+"-active")}).on("mousedown",function(){b(this).addClass(d+"-active")}).on("mouseup",function(){b(this).removeClass(d+"-active")}).on("focus"+this.eventNamespace,function(){b(this).addClass(d+"-hover")}).on("blur"+this.eventNamespace,function(){b(this).removeClass(d+"-hover").removeClass(d+"-active")})}else{e.on("mouseenter",function(){b(this).addClass("faiButton-hover")}).on("mouseleave",function(){b(this).removeClass("faiButton-hover").removeClass("faiButton-active")}).on("mousedown",function(){b(this).addClass("faiButton-active")}).on("mouseup",function(){b(this).removeClass("faiButton-active")}).on("focus"+this.eventNamespace,function(){b(this).addClass("faiButton-hover")}).on("blur"+this.eventNamespace,function(){b(this).removeClass(d+"-hover").removeClass("faiButton-active")})}}},_setOption:function(c,e){var f=this;var d=f.options;d[c]=e},disable:function(){var g=this;var f=g.options;var e=g.element;var c=b(e).is(":button");if(c){var d=b(e).attr("extClass");if(typeof d!="undefined"&&d!=""){b(e).prop("disabled",true).addClass(d+"-disabled")}else{b(e).prop("disabled",true).addClass("faiButton-disabled")}}},enable:function(){var g=this;var f=g.options;var e=g.element;var c=b(e).is(":button");if(c){var d=b(e).attr("extClass");if(typeof d!="undefined"&&d!=""){b(e).prop("disabled",false).removeClass(d+"-disabled")}else{b(e).prop("disabled",false).removeClass("faiButton-disabled")}}}})})(jQuery);var JPlaceHolder={_check:function(){return"placeholder" in document.createElement("input")},init:function(){if(!this._check()){this.fix()}},fix:function(){jQuery(":input[placeholder]").each(function(e,b){var l=$(this),c=l.attr("placeholder");var g=l.position(),d=l.outerHeight(true),i=l.outerWidth(true),k=l.css("padding-left"),j=l.css("padding-top");var j=parseInt(d/4);var f=$("").text(c).css({position:"absolute",left:g.left,top:g.top,height:d,lienHeight:d,paddingLeft:8,paddingTop:j}).appendTo(l.parent());l.focusin(function(h){}).focusout(function(h){if(!l.val()){f.show()}});l.keydown(function(h){f.hide();l.focus()});f.click(function(){l.focus()})})}};jQuery(function(){JPlaceHolder.init()});(function(c){var b=c.ui.resizable.prototype._setOption;c.ui.resizable.prototype._setOption=function(d,e){b.apply(this,arguments);if(d==="aspectRatio"){this._aspectRatio=!!e}}})(jQuery);(function(b){b.datepicker._base_gotoToday=b.datepicker._gotoToday;b.datepicker._gotoToday=function(h){var f=this._getInst(b(h)[0]),g=f.dpDiv;this._base_gotoToday(h);var e=this._get(f,"timepicker");c(e);var d=new Date();this._setTime(f,d);b(".ui-datepicker-today",g).click()};var c=function(g,f){if(g&&g.timezone_select){g._defaults.useLocalTimezone=true;var e=typeof f!=="undefined"?f:new Date();var d=b.timepicker.timeZoneOffsetString(e);if(g._defaults.timezoneIso8601){d=d.substring(0,3)+":"+d.substring(3)}g.timezone_select.val(d)}};b.datepicker._setTime=function(f,e){var d=this._get(f,"timepicker");if(d){var g=d._defaults;d.hour=e?e.getHours():g.hour;d.minute=e?e.getMinutes():g.minute;d.second=e?e.getSeconds():g.second;d.millisec=e?e.getMilliseconds():g.millisec;d._limitMinMaxDateTime(f,true);d._onTimeChange();d._updateDateTime(f)}}})(jQuery); \ No newline at end of file diff --git a/len-sys/src/main/resources/plugin/login/sys.min.css b/len-sys/src/main/resources/plugin/login/sys.min.css new file mode 100644 index 0000000..8744e69 --- /dev/null +++ b/len-sys/src/main/resources/plugin/login/sys.min.css @@ -0,0 +1,263 @@ +@charset "utf-8"; +body { + margin: 0; + padding: 0; + font: "宋体", "Arial"; + font-size: 12px +} + +img { + border: 0 +} + +.clear { + clear: both +} + + + + + + + + + + +.main-body { + width: 815px; + height: 576px; + top: 50%; + left: 50%; + position: absolute; + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + overflow: hidden +} + +.no-qrcode { + width: 428px +} + +.main-body .hide { + display: none !important +} + +.new-login { + width: 428px; + position: relative; + float: left +} + +.new-login .top { + width: 428px; + height: 117px; + background-color: #0371d1; + border-radius: 12px 12px 0 0; + font-family: SourceHanSansCN-Regular; + font-size: 30px; + font-weight: normal; + font-stretch: normal; + letter-spacing: 0; + color: #fff; + line-height: 117px; + text-align: center; + overflow: hidden; + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg) +} + +.new-login .top .bg1 { + display: inline-block; + width: 74px; + height: 74px; + background: #fff; + opacity: .1; + border-radius: 0 74px 0 0; + position: absolute; + left: 0; + top: 43px +} + +.new-login .top .bg2 { + display: inline-block; + width: 94px; + height: 94px; + background: #fff; + opacity: .1; + border-radius: 50%; + position: absolute; + right: -16px; + top: -16px +} + +.new-login .bottom { + width: 428px; + background: #fff; + border-radius: 0 0 12px 12px; + padding-bottom: 53px +} + +.new-login .bottom .center { + width: 288px; + margin: 0 auto; + padding-top: 40px; + padding-bottom: 15px; + position: relative +} + +.new-login .bottom .center .item { + width: 288px; + height: 35px; + border-bottom: 1px solid #dae1e6; + margin-bottom: 35px +} + +.new-login .bottom .center .item .validateImg { + position: absolute; + right: 36px; + cursor: pointer +} + +.new-login .bottom .center .error { + position: absolute; + height: 26px; + line-height: 25px; + width: 264px; + border: 1px solid #fdd3d3; + bottom: 8px; + padding-left: 33px; + color: #e63333; + display: none; + background: url(login_icon.png?v=201806191627) -104px -50px no-repeat #feefef +} + +.new-login .bottom .center .item .icon { + display: inline-block; + width: 33px; + height: 22px +} + +.new-login .bottom .center .item .icon-1 { + background: url("icon-login.png?v=201808271650") no-repeat 1px 0 +} + +.new-login .bottom .center .item .icon-2 { + background: url("icon-login.png?v=201808271650") no-repeat -54px 0 +} + +.new-login .bottom .center .item .icon-3 { + background: url("icon-login.png?v=201808271650") no-repeat -106px 0 +} + +.new-login .bottom .center .item .icon-4 { + background: url("icon-login.png?v=201808271650") no-repeat 0 -43px; + position: absolute; + right: -10px; + cursor: pointer +} + +.new-login .bottom .center .item .icon-5 { + background: url("icon-login.png?v=201808271650") no-repeat -55px -43px +} + +.new-login .bottom .center .item .icon-6 { + background: url("icon-login.png?v=201808271650") no-repeat 0 -93px; + position: absolute; + right: -10px; + margin-top: 8px; + cursor: pointer +} + +.new-login .bottom .center .item input { + display: inline-block; + width: 227px; + height: 22px; + padding: 0; + position: absolute; + border: 0; + outline: 0; + font-size: 14px; + letter-spacing: 0 +} + +.new-login .bottom .tip { + clear: both; + height: 16px; + line-height: 16px; + width: 288px; + margin: 0 auto +} + +.new-login .bottom .tip .icon-nocheck { + display: inline-block; + width: 10px; + height: 10px; + border-radius: 2px; + border: solid 1px #9abcda; + position: relative; + top: 2px; + margin: 1px 8px 1px 1px; + cursor: pointer +} + +.new-login .bottom .tip .icon-check { + margin: 0 7px 0 0; + width: 14px; + height: 14px; + border: 0; + background: url(icon-login.png?v=201808271650) no-repeat -111px -48px +} + +.new-login .bottom .tip .login-tip { + font-family: MicrosoftYaHei; + font-size: 12px; + font-weight: normal; + font-stretch: normal; + letter-spacing: 0; + color: #9abcda; + cursor: pointer +} + +.new-login .bottom .tip .no-pwd { + font-stretch: normal; + letter-spacing: 0; + color: #1391ff; + text-decoration: none; + position: absolute; + right: 62px +} + +.new-login .bottom .deal { + width: 288px; + height: 40px; + background-color: #229ffd; + border-radius: 16px; + margin: 0px auto 0; + text-align: center; + line-height: 40px; + color: #fff; + font-size: 14px; + letter-spacing: 0; + cursor: pointer; + outline: none; + border-width: 0px; +} + + +.foot { + position: absolute; + bottom: 28px; + text-align: center; + width: 100% +} + +.foot a { + text-decoration: none; + color: #c7c7c7 +} \ No newline at end of file -- Gitee From bc093aeec3b82e36039e8dfea4be3306853f66cf Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Thu, 24 Oct 2019 22:51:53 +0800 Subject: [PATCH 15/39] =?UTF-8?q?=E5=BC=B9=E6=A1=86=E8=84=B1=E7=A6=BB=20if?= =?UTF-8?q?rame=EF=BC=8C=E5=85=A8=E5=B1=8F=E5=BC=B9=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=91=E7=9A=84=E5=BE=85=E5=8A=9E=E5=8A=A0?= =?UTF-8?q?=E8=BD=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../len/controller/UserLeaveController.java | 19 +++++++------- .../resources/ftl/act/leave/leaveList.ftl | 12 +++------ .../main/resources/ftl/act/task/taskList.ftl | 6 ++--- .../src/main/resources/ftl/actList.ftl | 23 ---------------- .../main/resources/ftl/system/job/jobList.ftl | 16 ++++++------ .../resources/ftl/system/role/roleList.ftl | 26 ++++++------------- .../resources/ftl/system/user/userList.ftl | 21 +++++++-------- .../src/main/resources/plugin/tools/tool.js | 2 +- 8 files changed, 44 insertions(+), 81 deletions(-) diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java index 6747e4c..f7eff3a 100644 --- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java +++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java @@ -154,7 +154,6 @@ public class UserLeaveController extends BaseController { .processInstanceId(processId).singleResult(); //保证运行ing List leaveList = null; - List historicActivityInstanceList = new ArrayList<>(); if (instance != null) { Task task = this.taskService.createTaskQuery().processInstanceId(processId).singleResult(); Map variables = taskService.getVariables(task.getId()); @@ -170,7 +169,6 @@ public class UserLeaveController extends BaseController { HistoricVariableUpdate variable = null; for (HistoricDetail historicDetail : list) { variable = (HistoricVariableUpdate) historicDetail; - String variableName = variable.getVariableName(); if (leaveOpinionList.equals(variable.getVariableName())) { leaveList.clear(); leaveList.addAll((List) variable.getValue()); @@ -206,7 +204,6 @@ public class UserLeaveController extends BaseController { leaveService.updateByPrimaryKeySelective(oldLeave); Map variables = taskService.getVariables(taskId); -// UserLeave userLeave = (UserLeave) variables.get("userLeave"); Map map = new HashMap<>(); if (flag) { map.put("flag", true); @@ -272,7 +269,7 @@ public class UserLeaveController extends BaseController { SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(user.getId()); List userRoles = roleUserService.selectByCondition(sysRoleUser); - List roleString = new ArrayList(); + List roleString = new ArrayList<>(); for (SysRoleUser sru : userRoles) { roleString.add(sru.getRoleId()); } @@ -281,12 +278,16 @@ public class UserLeaveController extends BaseController { List candidateGroup = taskService.createTaskQuery().taskCandidateGroupIn(roleString).list(); taskList.addAll(assigneeList); taskList.addAll(candidateGroup); + int count=taskList.size(); + Integer index = (Integer.valueOf(page)-1) * Integer.valueOf(limit); + taskList=taskList.subList(index, taskList.size() > index + 10 ? index + 10 : taskList.size()); + List tasks = new ArrayList<>(); - Map map = new HashMap<>(); - com.len.entity.Task taskEntity = null; + Map map; + com.len.entity.Task taskEntity; Map> mapMap = new HashMap<>(); - Map objectMap = null; + Map objectMap; Set taskSet = new HashSet(); for (Task task1 : taskList) { objectMap = new HashMap<>(); @@ -302,7 +303,7 @@ public class UserLeaveController extends BaseController { taskEntity.setUserName(userLeave.getUserName()); taskEntity.setReason(userLeave.getReason()); taskEntity.setUrlpath(userLeave.getUrlpath()); - /**如果是自己*/ + /*如果是自己*/ if (user.getId().equals(userLeave.getUserId())) { if (map.get("flag") != null) { if (!(boolean) map.get("flag")) { @@ -320,7 +321,7 @@ public class UserLeaveController extends BaseController { tasks.add(taskEntity); taskSet.add(taskId); } - return ReType.jsonStrng(taskList.size(), tasks, mapMap, "id"); + return ReType.jsonStrng(count, tasks, mapMap, "id"); } @GetMapping("agent/{id}") diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index 55a0afe..b6f9d27 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -165,7 +165,7 @@ }); } , createLeave: function () { - add("申请请假", 'addLeave', 700, 450); + add("申请请假", '/leave/addLeave', 700, 450); } , reload: function () { $('#beginTime').val(''); @@ -186,7 +186,7 @@ } else if (obj.event === 'getProcImage') { activiti.img(data.processInstanceId); } else if (obj.event === 'leaveDetail') { - layer.open({ + window.top.layer.open({ id: 'leave-detail', type: 2, area: ['880px', '400px'], @@ -195,7 +195,7 @@ shadeClose: false, shade: 0.4, title: '审核详情', - content: "leaveDetail?processId=" + data.processInstanceId + content: "/leave/leaveDetail?processId=" + data.processInstanceId }); } }); @@ -207,20 +207,16 @@ if (title == null || title == '') { title = false; } - ; if (url == null || url == '') { url = "404.html"; } - ; if (w == null || w == '') { w = ($(window).width() * 0.9); } - ; if (h == null || h == '') { h = ($(window).height() - 50); } - ; - layer.open({ + window.top.layer.open({ id: 'leave-add', type: 2, area: [w + 'px', h + 'px'], diff --git a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl index 7a89955..bd9213d 100644 --- a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl @@ -151,11 +151,11 @@ table.on('tool(task)', function (obj) { var data = obj.data; if (obj.event === 'handle') { - popup('办理','agent/'+data.id,700,500,'task-agent'); + popup('办理','/leave/agent/'+data.id,700,500,'task-agent'); }else if(obj.event === 'update'){ popup('编辑','${re.contextPath}/leave/updateLeave/'+data.id,700,500,'task-update'); }else if(obj.event==='leaveDetail'){ - layer.open({ + window.top.layer.open({ id: 'leave-detail', type: 2, area: [ '880px', '400px'], @@ -164,7 +164,7 @@ shadeClose: false, shade: 0.4, title: '审核详情', - content: "leaveDetail?processId="+data.processInstanceId + content: "/leave/leaveDetail?processId="+data.processInstanceId }); } }); diff --git a/len-activiti/src/main/resources/ftl/actList.ftl b/len-activiti/src/main/resources/ftl/actList.ftl index f0454e7..ee28385 100644 --- a/len-activiti/src/main/resources/ftl/actList.ftl +++ b/len-activiti/src/main/resources/ftl/actList.ftl @@ -32,9 +32,6 @@
        <@shiro.hasPermission name="control:del"> - <#-- -->
        @@ -168,26 +165,6 @@ }); } - /** - * 流程绑定节点 - * @param id - */ - /* function assignee(id,deploymentId){ - var index = - layer.open({ - id: 'assignee', - type: 2, - area: ['600px', '350px'], - fix: false, - maxmin: true, - shadeClose: false, - shade: 0.4, - title: '设置流程节点', - content: 'goAssignee/'+deploymentId - }); - layer.full(index); - }*/ - diff --git a/len-sys/src/main/resources/ftl/system/job/jobList.ftl b/len-sys/src/main/resources/ftl/system/job/jobList.ftl index 64a3bbb..05feda9 100644 --- a/len-sys/src/main/resources/ftl/system/job/jobList.ftl +++ b/len-sys/src/main/resources/ftl/system/job/jobList.ftl @@ -162,7 +162,7 @@ }); }, add: function () { - add('添加任务', 'showAddJob', 700, 450); + add('添加任务', '/job/showAddJob', 700, 450); }, update: function () { var checkStatus = table.checkStatus('jobList') @@ -175,7 +175,7 @@ layer.msg('已经启动任务无法更新,请停止后更新',{icon:5,offset: 'rb',area:['200px','100px'],anim:2}); return false; } - update('编辑任务', 'updateJob?id=' + data[0].id, 700, 450); + update('编辑任务', '/job/updateJob?id=' + data[0].id, 700, 450); }, detail: function () { var checkStatus = table.checkStatus('jobList') @@ -184,14 +184,14 @@ layer.msg('请选择一行查看', {icon: 5}); return false; } - detail('查看任务信息', 'updateJob?id=' + data[0].id, 700, 450); + detail('查看任务信息', '/job/updateJob?id=' + data[0].id, 700, 450); } }; //监听工具条 table.on('tool(job)', function (obj) { var data = obj.data; if (obj.event === 'detail') { - detail('编辑角色', 'updateJob?id=' + data.id, 700, 450); + detail('编辑角色', '/job/updateJob?id=' + data.id, 700, 450); } else if (obj.event === 'del') { if(!data.status) { layer.confirm('确定删除任务[]?', @@ -203,7 +203,7 @@ } } else if (obj.event === 'edit') { if(!data.status){ - update('编辑任务', 'updateJob?id=' + data.id, 700, 450); + update('编辑任务', '/job/updateJob?id=' + data.id, 700, 450); }else{ layer.msg('已经启动任务无法更新,请停止后更新',{icon:5,offset: 'rb',area:['200px','100px'],anim:2}); } @@ -268,7 +268,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-detail', type: 2, area: [w + 'px', h + 'px'], @@ -297,7 +297,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-update', type: 2, area: [w + 'px', h + 'px'], @@ -332,7 +332,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'job-add', type: 2, area: [w + 'px', h + 'px'], diff --git a/len-sys/src/main/resources/ftl/system/role/roleList.ftl b/len-sys/src/main/resources/ftl/system/role/roleList.ftl index 45cecf0..aa54c51 100644 --- a/len-sys/src/main/resources/ftl/system/role/roleList.ftl +++ b/len-sys/src/main/resources/ftl/system/role/roleList.ftl @@ -150,7 +150,7 @@ }); }, add: function () { - add('添加角色', 'showAddRole', 700, 450); + add('添加角色', '/role/showAddRole', 700, 450); }, update: function () { var checkStatus = table.checkStatus('roleList') @@ -159,7 +159,7 @@ layer.msg('请选择一行编辑', {icon: 5}); return false; } - update('编辑角色', 'updateRole?id=' + data[0].id, 700, 450); + update('编辑角色', '/role/updateRole?id=' + data[0].id, 700, 450); }, detail: function () { var checkStatus = table.checkStatus('roleList') @@ -168,7 +168,7 @@ layer.msg('请选择一行查看', {icon: 5}); return false; } - detail('查看角色信息', 'updateRole?id=' + data[0].id, 700, 450); + detail('查看角色信息', '/role/updateRole?id=' + data[0].id, 700, 450); } }; @@ -180,13 +180,13 @@ table.on('tool(user)', function (obj) { var data = obj.data; if (obj.event === 'detail') { - detail('编辑角色', 'updateRole?id=' + data.id, 700, 450); + detail('编辑角色', '/role/updateRole?id=' + data.id, 700, 450); } else if (obj.event === 'del') { layer.confirm('确定删除角色[]?', function(){ del(data.id); }); } else if (obj.event === 'edit') { - update('编辑角色', 'updateRole?id=' + data.id, 700, 450); + update('编辑角色', '/role/updateRole?id=' + data.id, 700, 450); } }); @@ -212,24 +212,19 @@ }); } function detail(title, url, w, h) { - var number = 1; if (title == null || title == '') { title = false; } - ; if (url == null || url == '') { url = "/error/404"; } - ; if (w == null || w == '') { w = ($(window).width() * 0.9); } - ; if (h == null || h == '') { h = ($(window).height() - 50); } - ; - layer.open({ + window.top.layer.open({ id: 'user-detail', type: 2, area: [w + 'px', h + 'px'], @@ -239,7 +234,6 @@ shade: 0.4, title: title, content: url + '&detail=true', - // btn:['关闭'] }); } /** @@ -258,7 +252,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-update', type: 2, area: [w + 'px', h + 'px'], @@ -284,20 +278,16 @@ if (title == null || title == '') { title = false; } - ; if (url == null || url == '') { url = "/error/404"; } - ; if (w == null || w == '') { w = ($(window).width() * 0.9); } - ; if (h == null || h == '') { h = ($(window).height() - 50); } - ; - layer.open({ + window.top.layer.open({ id: 'user-add', type: 2, area: [w + 'px', h + 'px'], diff --git a/len-sys/src/main/resources/ftl/system/user/userList.ftl b/len-sys/src/main/resources/ftl/system/user/userList.ftl index 8060795..2f77eab 100644 --- a/len-sys/src/main/resources/ftl/system/user/userList.ftl +++ b/len-sys/src/main/resources/ftl/system/user/userList.ftl @@ -114,7 +114,6 @@ select: function () { var uname = $('#uname').val(); var email = $('#email').val(); - console.info(uname); table.reload('userList', { where: { username: uname, @@ -133,7 +132,7 @@ }); }, add: function () { - add('添加用户', 'showAddUser', 700, 450); + add('添加用户', '/user/showAddUser', 700, 450); }, update: function () { var checkStatus = table.checkStatus('userList') @@ -142,7 +141,7 @@ layer.msg('请选择一行编辑,已选[' + data.length + ']行', {icon: 5}); return false; } - update('编辑用户', 'updateUser?id=' + data[0].id, 700, 450); + update('编辑用户', '/user/updateUser?id=' + data[0].id, 700, 450); }, detail: function () { var checkStatus = table.checkStatus('userList') @@ -151,7 +150,7 @@ layer.msg('请选择一行查看,已选[' + data.length + ']行', {icon: 5}); return false; } - detail('查看用户信息', 'updateUser?id=' + data[0].id, 700, 450); + detail('查看用户信息', '/user/updateUser?id=' + data[0].id, 700, 450); }, changePwd: function () { var checkStatus = table.checkStatus('userList') @@ -160,7 +159,7 @@ layer.msg('请选择一个用户,已选[' + data.length + ']行', {icon: 5}); return false; } - rePwd('修改密码', 'goRePass?id=' + data[0].id, 500, 350); + rePwd('修改密码', '/user/goRePass?id=' + data[0].id, 500, 350); } }; @@ -172,7 +171,7 @@ table.on('tool(user)', function (obj) { var data = obj.data; if (obj.event === 'detail') { - detail('编辑用户', 'updateUser?id=' + data.id, 700, 450); + detail('编辑用户', '/user/updateUser?id=' + data.id, 700, 450); } else if (obj.event === 'del') { layer.confirm('确定删除用户[]?', { btn: ['逻辑删除', '物理删除'] @@ -182,7 +181,7 @@ toolDelByFlag(data.id, 'userList', false); }); } else if (obj.event === 'edit') { - update('编辑用户', 'updateUser?id=' + data.id, 700, 450); + update('编辑用户', '/user/updateUser?id=' + data.id, 700, 450); } }); @@ -206,7 +205,7 @@ if (h == null || h === '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-rePwd', type: 2, area: [w + 'px', h + 'px'], @@ -232,7 +231,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-detail', type: 2, area: [w + 'px', h + 'px'], @@ -261,7 +260,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-update', type: 2, area: [w + 'px', h + 'px'], @@ -296,7 +295,7 @@ if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: 'user-add', type: 2, area: [w + 'px', h + 'px'], diff --git a/len-sys/src/main/resources/plugin/tools/tool.js b/len-sys/src/main/resources/plugin/tools/tool.js index ffc3f69..089986e 100644 --- a/len-sys/src/main/resources/plugin/tools/tool.js +++ b/len-sys/src/main/resources/plugin/tools/tool.js @@ -14,7 +14,7 @@ function popup(title, url, w, h,id) { if (h == null || h == '') { h = ($(window).height() - 50); } - layer.open({ + window.top.layer.open({ id: id, type: 2, area: [w + 'px', h + 'px'], -- Gitee From defaf1c3f8b2c5d585bacb4d27b599a04b922f36 Mon Sep 17 00:00:00 2001 From: meng <154040976@qq.com> Date: Tue, 19 Nov 2019 23:05:44 +0800 Subject: [PATCH 16/39] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9tkmapper=20?= =?UTF-8?q?=E4=B8=BAmybatis=20plus=202=E3=80=81=E5=8D=87=E7=BA=A7layui?= =?UTF-8?q?=E5=88=B0=E6=9C=80=E6=96=B0=203=E3=80=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E4=BF=AE=E6=94=B9UI=204=E3=80=81activiti=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9UI=205=E3=80=81=E5=B0=81=E8=A3=85=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=AF=B7=E6=B1=82=206=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=B7=A5=E4=BD=9C=E6=B5=81=207=E3=80=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BB=AA=E8=A1=A8=E7=9B=98=208=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E6=9B=B4=E6=96=B0=E5=BC=B9=E6=A1=86=E4=B8=8D?= =?UTF-8?q?=E9=99=90=E4=BA=8E=E5=BD=93=E5=89=8Diframe=E5=86=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/len/actlistener/ActNodeListener.java | 3 +- .../len/actlistener/ActStartNodeListener.java | 7 - .../len/actlistener/LeaveListenerImpl.java | 3 +- .../com/len/actlistener/ListenUserRole.java | 9 +- .../len/controller/ActivitiController.java | 14 +- .../len/controller/UserLeaveController.java | 48 +-- .../main/java/com/len/entity/ActAssignee.java | 19 +- .../main/java/com/len/entity/ActModel.java | 5 +- .../main/java/com/len/entity/BaseTask.java | 17 +- .../main/java/com/len/entity/UserLeave.java | 29 +- .../com/len/mapper/ActAssigneeMapper.java | 3 +- .../java/com/len/mapper/UserLeaveMapper.java | 3 +- .../com/len/service/UserLeaveService.java | 3 + .../service/impl/ActAssigneeServiceImpl.java | 6 - .../service/impl/UserLeaveServiceImpl.java | 19 +- .../org/activiti/rest/ActivitiService.java | 29 +- .../activiti/rest/model/ActivitiProcess.java | 5 + .../resources/ftl/act/activiti/shinePics.html | 16 +- .../resources/ftl/act/leave/add-leave.ftl | 267 ++++++++-------- .../resources/ftl/act/leave/leaveList.ftl | 15 +- .../main/resources/ftl/act/task/taskList.ftl | 2 +- .../src/main/resources/ftl/actList.ftl | 2 +- .../src/main/resources/ftl/actModelList.ftl | 2 +- .../com/len/controller/ArticleController.java | 9 +- .../len/controller/BlogAdminController.java | 2 +- .../controller/BlogCategoryController.java | 2 +- .../com/len/controller/SignController.java | 17 +- .../com/len/controller/TagController.java | 2 +- .../java/com/len/entity/ArticleCategory.java | 17 +- .../main/java/com/len/entity/ArticleTag.java | 12 +- .../main/java/com/len/entity/BlogArticle.java | 30 +- .../java/com/len/entity/BlogCategory.java | 25 +- .../src/main/java/com/len/entity/BlogTag.java | 18 +- .../com/len/mapper/ArticleCategoryMapper.java | 2 +- .../java/com/len/mapper/ArticleTagMapper.java | 3 +- .../com/len/mapper/BlogArticleMapper.java | 2 +- .../com/len/mapper/BlogCategoryMapper.java | 2 +- .../java/com/len/mapper/BlogTagMapper.java | 2 +- .../impl/ArticleCategoryServiceImpl.java | 5 - .../service/impl/ArticleTagServiceImpl.java | 5 - .../service/impl/BlogArticleServiceImpl.java | 68 +++-- .../service/impl/BlogCategoryServiceImpl.java | 7 - .../len/service/impl/BlogTagServiceImpl.java | 11 - .../java/com/len/base/AbstractEntity.java | 27 ++ .../main/java/com/len/base/BaseMapper.java | 60 +--- .../main/java/com/len/base/BaseService.java | 56 +--- ...rtListAndinsertUseGeneratedKeysMapper.java | 23 -- .../java/com/len/base/MySpecialProvider.java | 82 ----- .../len/base/impl/AbstractServiceImpl.java | 71 +++++ .../com/len/base/impl/BaseServiceImpl.java | 289 +----------------- .../src/main/java/com/len/util/UuidUtil.java | 14 + .../com/len/controller/JobController.java | 4 +- .../com/len/controller/LogController.java | 2 +- .../com/len/controller/LoginController.java | 4 +- .../com/len/controller/MenuController.java | 10 +- .../com/len/controller/PersonController.java | 11 +- .../com/len/controller/RoleController.java | 2 +- .../com/len/controller/UserController.java | 21 +- .../BootListener/DataSourceJobThread.java | 7 +- .../com/len/core/annotation/LogAspect.java | 1 + .../core/quartz/CustomQuartz/JobDemo1.java | 2 +- .../core/quartz/CustomQuartz/JobDemo2.java | 2 +- .../core/quartz/CustomQuartz/JobDemo3.java | 2 +- .../core/quartz/CustomQuartz/JobDemo4.java | 2 +- .../core/quartz/CustomQuartz/JobDemo5.java | 2 +- .../main/java/com/len/entity/SysDepart.java | 13 +- .../src/main/java/com/len/entity/SysJob.java | 32 +- .../src/main/java/com/len/entity/SysLog.java | 16 +- .../src/main/java/com/len/entity/SysMenu.java | 45 +-- .../src/main/java/com/len/entity/SysRole.java | 29 +- .../main/java/com/len/entity/SysRoleMenu.java | 45 +-- .../main/java/com/len/entity/SysRoleUser.java | 45 +-- .../src/main/java/com/len/entity/SysUser.java | 39 +-- .../java/com/len/entity/SysUserDepart.java | 11 +- .../java/com/len/mapper/SysDepartMapper.java | 2 +- .../java/com/len/mapper/SysJobMapper.java | 3 +- .../java/com/len/mapper/SysLogMapper.java | 3 +- .../java/com/len/mapper/SysMenuMapper.java | 9 +- .../java/com/len/mapper/SysRoleMapper.java | 3 +- .../com/len/mapper/SysRoleMenuMapper.java | 2 +- .../com/len/mapper/SysRoleUserMapper.java | 3 +- .../com/len/mapper/SysUserDepartMapper.java | 3 +- .../java/com/len/mapper/SysUserMapper.java | 11 +- .../java/com/len/service/MenuService.java | 4 - .../java/com/len/service/RoleService.java | 30 +- .../java/com/len/service/RoleUserService.java | 9 - .../java/com/len/service/SysUserService.java | 73 ++--- .../com/len/service/impl/JobServiceImpl.java | 25 +- .../com/len/service/impl/MenuServiceImpl.java | 26 +- .../len/service/impl/RoleMenuServiceImpl.java | 6 +- .../com/len/service/impl/RoleServiceImpl.java | 60 ++-- .../len/service/impl/RoleUserServiceImpl.java | 23 -- .../len/service/impl/SysUserServiceImpl.java | 65 +--- .../src/main/resources/ftl/main/index.html | 268 ++++++++++++++++ .../main/resources/ftl/system/base/header.ftl | 37 ++- .../main/resources/ftl/system/job/jobList.ftl | 2 +- .../main/resources/ftl/system/person/me.ftl | 1 - .../resources/ftl/system/role/roleList.ftl | 48 +-- .../resources/ftl/system/user/add-user.ftl | 3 - .../resources/ftl/system/user/update-user.ftl | 5 - .../resources/ftl/system/user/userList.ftl | 6 +- .../src/main/resources/plugin/build/js/app.js | 8 +- .../src/main/resources/plugin/build/js/tab.js | 5 +- .../plugin/plugins/echarts/echart.min.js | 22 ++ .../src/main/resources/plugin/tools/main.js | 9 +- .../src/main/resources/plugin/tools/tool.js | 8 +- .../resources/plugin/x-admin/js/xadmin.js | 18 +- .../src/main/java/com/len/LenApplication.java | 2 +- .../com/len/config/MyBatisPlusConfig.java | 32 ++ .../java/com/len/config/PageHelperConfig.java | 13 +- .../java/com/len/config/ZBeanFactory.java | 2 +- len-web/src/main/java/test/BlogTest.java | 2 +- len-web/src/main/java/test/BootTest.java | 2 +- .../main/resources/application-mysql-dev.yml | 12 +- pom.xml | 41 ++- 115 files changed, 1173 insertions(+), 1469 deletions(-) create mode 100644 len-core/src/main/java/com/len/base/AbstractEntity.java delete mode 100644 len-core/src/main/java/com/len/base/LenInsertListAndinsertUseGeneratedKeysMapper.java delete mode 100644 len-core/src/main/java/com/len/base/MySpecialProvider.java create mode 100644 len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java create mode 100644 len-core/src/main/java/com/len/util/UuidUtil.java create mode 100644 len-sys/src/main/resources/ftl/main/index.html create mode 100644 len-sys/src/main/resources/plugin/plugins/echarts/echart.min.js create mode 100644 len-web/src/main/java/com/len/config/MyBatisPlusConfig.java diff --git a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java index f686367..673daa6 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java @@ -15,6 +15,7 @@ */ package com.len.actlistener; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.entity.ActAssignee; import com.len.service.ActAssigneeService; import com.len.service.impl.ActAssigneeServiceImpl; @@ -40,7 +41,7 @@ public class ActNodeListener implements TaskListener { //KEY String nodeId = delegateTask.getTaskDefinitionKey(); ActAssigneeService actAssigneeService = SpringUtil.getBean(ActAssigneeServiceImpl.class); - List assigneeList = actAssigneeService.selectListByPage(new ActAssignee(nodeId)); + List assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); for (ActAssignee assignee : assigneeList) { switch (assignee.getAssigneeType()) { case AssigneeType.GROUP_TYPE: diff --git a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java index a04f1be..3f42e7d 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java @@ -15,17 +15,10 @@ */ package com.len.actlistener; -import com.len.entity.ActAssignee; import com.len.entity.BaseTask; -import com.len.entity.UserLeave; -import com.len.service.ActAssigneeService; -import com.len.service.impl.ActAssigneeServiceImpl; -import com.len.util.AssigneeType; -import com.len.util.SpringUtil; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; -import java.util.List; import java.util.Map; /** diff --git a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java index 15e1125..4d008ff 100644 --- a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java +++ b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java @@ -16,11 +16,10 @@ package com.len.actlistener; import com.len.entity.UserLeave; +import org.activiti.engine.delegate.DelegateTask; import java.util.Map; -import org.activiti.engine.delegate.DelegateTask; - /** * @author zhuxiaomeng * @date 2018/1/25. diff --git a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java index 30736a0..59f771d 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java +++ b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java @@ -20,11 +20,6 @@ import com.len.entity.SysRoleUser; import com.len.entity.SysUser; import com.len.service.SysUserService; import com.len.util.LenResponse; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.activiti.engine.IdentityService; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; @@ -36,6 +31,10 @@ import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * @author zhuxiaomeng * @date 2018/1/25. diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java index e07f4f9..5af3e0c 100644 --- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java +++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java @@ -17,6 +17,8 @@ package com.len.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.additional.query.impl.QueryChainWrapper; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -110,7 +112,7 @@ public class ActivitiController extends BaseController { public LenResponse syncdata() { LenResponse j = new LenResponse(); try { - List userList = userService.selectListByPage(new SysUser()); + List userList = userService.list(); User au; for (SysUser user : userList) { au = new UserEntity(); @@ -120,7 +122,7 @@ public class ActivitiController extends BaseController { identityService.deleteUser(au.getId()); identityService.saveUser(au); } - List sysRoleList = roleService.selectListByPage(new SysRole()); + List sysRoleList = roleService.list(); Group group; for (SysRole role : sysRoleList) { group = new GroupEntity(); @@ -129,7 +131,7 @@ public class ActivitiController extends BaseController { identityService.deleteGroup(group.getId()); identityService.saveGroup(group); } - List roleUserList = roleUserService.selectByCondition(new SysRoleUser()); + List roleUserList = roleUserService.list(); for (SysRoleUser sysRoleUser : roleUserList) { identityService.deleteMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); @@ -305,7 +307,7 @@ public class ActivitiController extends BaseController { /**根据流程实例id查询出所有流程节点*/ List activityList = actAssigneeService.getActivityList(deploymentId); /**角色和节点关系封装成list*/ - List roleList = roleService.selectListByPage(new SysRole()); + List roleList = roleService.list(); Checkbox checkbox = null; Map map = null; List> mapList = new ArrayList<>(); @@ -319,7 +321,7 @@ public class ActivitiController extends BaseController { } //节点id 、name、节点目前关联的角色 封装成进map String nodeId = activiti.getId(); - assigneeList = actAssigneeService.select(new ActAssignee(nodeId)); + assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId))); List strings = new ArrayList<>(); assigneeList.forEach(actAssignee1 -> strings.add(actAssignee1.getRoleId())); map.put("id", nodeId); @@ -373,7 +375,7 @@ public class ActivitiController extends BaseController { } //后添加 在map循环里添加 多角色会导致添加了的再次被删除 so 要拿出来 for (ActAssignee actAssignee : assigneeList) { - actAssigneeService.insertSelective(actAssignee); + actAssigneeService.save(actAssignee); } j.setMsg("更新成功"); return j; diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java index f7eff3a..6c048cf 100644 --- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java +++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java @@ -18,6 +18,7 @@ package com.len.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.len.base.BaseController; @@ -119,7 +120,7 @@ public class UserLeaveController extends BaseController { @GetMapping(value = "showLeaveList") @ResponseBody - public ReType showLeaveList(Model model, UserLeave userLeave, String page, String limit) { + public ReType showLeaveList(UserLeave userLeave, String page, String limit) { String userId = CommonUtil.getUser().getId(); userLeave.setUserId(userId); List tList = null; @@ -188,7 +189,7 @@ public class UserLeaveController extends BaseController { public String updateLeave(Model model, @PathVariable String taskId) { Map variables = taskService.getVariables(taskId); BaseTask baseTask = (BaseTask) variables.get("baseTask"); - UserLeave leave = leaveService.selectByPrimaryKey(baseTask.getId()); + UserLeave leave = leaveService.getById(baseTask.getId()); model.addAttribute("leave", leave); model.addAttribute("taskId", taskId); return "/act/leave/update-leave"; @@ -199,9 +200,10 @@ public class UserLeaveController extends BaseController { public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) { LenResponse j = new LenResponse(); try { - UserLeave oldLeave = leaveService.selectByPrimaryKey(leave.getId()); + UserLeave oldLeave = leaveService.getById(leave.getId()); BeanUtil.copyNotNullBean(leave, oldLeave); - leaveService.updateByPrimaryKeySelective(oldLeave); + QueryWrapper userLeaveQueryWrapper = new QueryWrapper<>(oldLeave); + leaveService.update(userLeaveQueryWrapper); Map variables = taskService.getVariables(taskId); Map map = new HashMap<>(); @@ -223,33 +225,42 @@ public class UserLeaveController extends BaseController { @PostMapping("addLeave") @ResponseBody - public LenResponse addLeave(Model model, UserLeave userLeave) { + public LenResponse addLeave(UserLeave userLeave) { LenResponse j = new LenResponse(); if (userLeave == null) { return LenResponse.error("获取数据失败"); } - userLeave.setDays(3); + long beginTime = userLeave.getBeginTime().getTime(); + long endTime = userLeave.getEndTime().getTime(); + int days = 1; + if (endTime != beginTime) { + days += (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24)); + } + if (days <= 0) { + return LenResponse.error("时间输入有误"); + } + + userLeave.setDays(days); CurrentUser user = CommonUtil.getUser(); userLeave.setUserId(user.getId()); userLeave.setUserName(user.getUsername()); - userLeave.setProcessInstanceId("2018");//模拟数据 - leaveService.insertSelective(userLeave); + userLeave.setProcessInstanceId("2018"); + leaveService.save(userLeave); Map map = new HashMap<>(); userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); map.put("baseTask", userLeave); + map.put("day", days); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_leave", map); userLeave.setProcessInstanceId(processInstance.getId()); - UserLeave userLeave1 = leaveService.selectByPrimaryKey(userLeave.getId()); - BeanUtil.copyNotNullBean(userLeave, userLeave1); - userLeave1.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); - leaveService.updateByPrimaryKeySelective(userLeave1); + userLeave.setUrlpath("/leave/readOnlyLeave/" + userLeave.getId()); + leaveService.updateById(userLeave); j.setMsg("请假申请成功"); return j; } @GetMapping("readOnlyLeave/{billId}") public String readOnlyLeave(Model model, @PathVariable String billId) { - UserLeave leave = leaveService.selectByPrimaryKey(billId); + UserLeave leave = leaveService.getById(billId); model.addAttribute("leave", leave); return "/act/leave/update-leave-readonly"; } @@ -268,7 +279,8 @@ public class UserLeaveController extends BaseController { CurrentUser user = CommonUtil.getUser(); SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(user.getId()); - List userRoles = roleUserService.selectByCondition(sysRoleUser); + QueryWrapper queryWrapper = new QueryWrapper<>(sysRoleUser); + List userRoles = roleUserService.list(queryWrapper); List roleString = new ArrayList<>(); for (SysRoleUser sru : userRoles) { roleString.add(sru.getRoleId()); @@ -278,9 +290,9 @@ public class UserLeaveController extends BaseController { List candidateGroup = taskService.createTaskQuery().taskCandidateGroupIn(roleString).list(); taskList.addAll(assigneeList); taskList.addAll(candidateGroup); - int count=taskList.size(); - Integer index = (Integer.valueOf(page)-1) * Integer.valueOf(limit); - taskList=taskList.subList(index, taskList.size() > index + 10 ? index + 10 : taskList.size()); + int count = taskList.size(); + Integer index = (Integer.valueOf(page) - 1) * Integer.valueOf(limit); + taskList = taskList.subList(index, taskList.size() > index + 10 ? index + 10 : taskList.size()); List tasks = new ArrayList<>(); Map map; @@ -365,6 +377,8 @@ public class UserLeaveController extends BaseController { leaveList = (List) o; } leaveList.add(op); + UserLeave userLeave=(UserLeave)variables.get("baseTask"); + map.put("day",userLeave.getDays()); map.put(leaveOpinionList, leaveList); j.setMsg("审核成功" + (op.isFlag() ? "[通过]" : "[未通过]")); taskService.complete(op.getTaskId(), map); diff --git a/len-activiti/src/main/java/com/len/entity/ActAssignee.java b/len-activiti/src/main/java/com/len/entity/ActAssignee.java index c7bdfa3..b841f36 100644 --- a/len-activiti/src/main/java/com/len/entity/ActAssignee.java +++ b/len-activiti/src/main/java/com/len/entity/ActAssignee.java @@ -1,39 +1,44 @@ package com.len.entity; -import javax.persistence.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; -@Table(name = "act_assignee") + +@TableName(value = "act_assignee") public class ActAssignee { - @Id - @Column(name = "id") + @TableId(value = "id", type = IdType.UUID) private String id; /** * 节点id */ + @TableField(value = "sid") private String sid; /** * 办理人 */ + @TableField(value = "assignee") private String assignee; /** * 候选组(角色) */ - @Column(name = "role_id") + @TableField(value = "role_id") private String roleId; /** * 办理人类型1办理人2候选人3组 */ - @Column(name = "assignee_type") + @TableField(value = "assignee_type") private Integer assigneeType; /** * 节点名称 */ - @Column(name = "activti_name") + @TableField(value = "activti_name") private String activtiName; /** diff --git a/len-activiti/src/main/java/com/len/entity/ActModel.java b/len-activiti/src/main/java/com/len/entity/ActModel.java index c77633b..4d78554 100644 --- a/len-activiti/src/main/java/com/len/entity/ActModel.java +++ b/len-activiti/src/main/java/com/len/entity/ActModel.java @@ -16,6 +16,8 @@ package com.len.entity; import java.util.Date; + +import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -27,8 +29,7 @@ import org.activiti.engine.repository.Model; * @email 154040976@qq.com * 模型列表 */ -@Getter -@Setter +@Data public class ActModel { private String id; diff --git a/len-activiti/src/main/java/com/len/entity/BaseTask.java b/len-activiti/src/main/java/com/len/entity/BaseTask.java index 99b901b..76769ff 100644 --- a/len-activiti/src/main/java/com/len/entity/BaseTask.java +++ b/len-activiti/src/main/java/com/len/entity/BaseTask.java @@ -1,17 +1,13 @@ package com.len.entity; -import javax.persistence.*; import java.io.Serializable; import java.util.Date; /** * Created by kingdee-001 on 2018/6/30. */ -@MappedSuperclass -public abstract class BaseTask implements Serializable{ +public abstract class BaseTask implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.AUTO,generator = "JDBC") protected String id; /** @@ -28,29 +24,22 @@ public abstract class BaseTask implements Serializable{ this.id = id == null ? null : id.trim(); } - @Column(name = "user_id") + protected String userId; - @Column(name = "user_name") protected String userName; - - @Column(name = "process_instance_Id") protected String processInstanceId; protected String status; - @Column(name = "create_date") protected Date createDate; - @Column(name = "create_by") protected String createBy; - @Column(name = "update_date") protected Date updateDate; - @Column(name = "update_by") protected String updateBy; @@ -67,8 +56,6 @@ public abstract class BaseTask implements Serializable{ private Integer submittimes; - - /** * @return user_id */ diff --git a/len-activiti/src/main/java/com/len/entity/UserLeave.java b/len-activiti/src/main/java/com/len/entity/UserLeave.java index 12c645d..276e40e 100644 --- a/len-activiti/src/main/java/com/len/entity/UserLeave.java +++ b/len-activiti/src/main/java/com/len/entity/UserLeave.java @@ -1,16 +1,18 @@ package com.len.entity; -import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + import java.util.ArrayList; import java.util.Date; import java.util.List; -import javax.persistence.*; -@Table(name = "user_leave") +@TableName(value = "user_leave") public class UserLeave extends BaseTask { - @Id - @GeneratedValue(strategy = GenerationType.AUTO,generator = "JDBC") + @TableId(value = "id", type = IdType.UUID) protected String id; /** @@ -31,36 +33,37 @@ public class UserLeave extends BaseTask { private Integer days; - @Column(name = "begin_time") + @TableField(value = "begin_time") private Date beginTime; - @Column(name = "end_time") + @TableField(value = "end_time") private Date endTime; - @Column(name = "process_instance_Id") + @TableField(value = "process_instance_Id") private String processInstanceId; private String status; - @Column(name = "create_date") + @TableField(value = "create_date") private Date createDate; - @Column(name = "create_by") + @TableField(value = "create_by") private String createBy; - @Column(name = "update_date") + @TableField(value = "update_date") private Date updateDate; - @Column(name = "update_by") + @TableField(value = "update_by") private String updateBy; //***实时节点信息 - @Transient + @TableField(exist = false) private String taskName; //请假单审核信息 + @TableField(exist = false) private List opinionList=new ArrayList<>(); public void leaveOpAdd(LeaveOpinion leaveOpinion){ diff --git a/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java b/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java index 7690fd9..39590bd 100644 --- a/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java +++ b/len-activiti/src/main/java/com/len/mapper/ActAssigneeMapper.java @@ -2,8 +2,7 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.ActAssignee; -import tk.mybatis.mapper.common.Mapper; -public interface ActAssigneeMapper extends BaseMapper { +public interface ActAssigneeMapper extends BaseMapper { int deleteByNodeId(String nodeId); } \ No newline at end of file diff --git a/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java b/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java index 2e1cd08..a15dc9d 100644 --- a/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java +++ b/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.UserLeave; -import tk.mybatis.mapper.common.Mapper; -public interface UserLeaveMapper extends BaseMapper { +public interface UserLeaveMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-activiti/src/main/java/com/len/service/UserLeaveService.java b/len-activiti/src/main/java/com/len/service/UserLeaveService.java index 9f6273c..4e586ad 100644 --- a/len-activiti/src/main/java/com/len/service/UserLeaveService.java +++ b/len-activiti/src/main/java/com/len/service/UserLeaveService.java @@ -3,6 +3,8 @@ package com.len.service; import com.len.base.BaseService; import com.len.entity.UserLeave; +import java.util.List; + /** * @author zhuxiaomeng * @date 2018/1/21. @@ -10,4 +12,5 @@ import com.len.entity.UserLeave; */ public interface UserLeaveService extends BaseService { + public List selectListByPage(UserLeave record); } diff --git a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java index bdaf176..f230173 100644 --- a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java @@ -1,6 +1,5 @@ package com.len.service.impl; -import com.len.base.BaseMapper; import com.len.base.impl.BaseServiceImpl; import com.len.entity.ActAssignee; import com.len.mapper.ActAssigneeMapper; @@ -34,11 +33,6 @@ public class ActAssigneeServiceImpl extends BaseServiceImpl @Autowired private RepositoryService repositoryService; - @Override - public BaseMapper getMappser() { - return actAssigneeMapper; - } - @Override public int deleteByNodeId(String nodeId) { return actAssigneeMapper.deleteByNodeId(nodeId); diff --git a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java index 2b7edd4..6bb2376 100644 --- a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java @@ -1,6 +1,5 @@ package com.len.service.impl; -import com.len.base.BaseMapper; import com.len.base.impl.BaseServiceImpl; import com.len.entity.UserLeave; import com.len.mapper.UserLeaveMapper; @@ -8,20 +7,22 @@ import com.len.service.UserLeaveService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * @author zhuxiaomeng * @date 2018/1/21. * @email 154040976@qq.com */ @Service -public class UserLeaveServiceImpl extends BaseServiceImpl implements - UserLeaveService { +public class UserLeaveServiceImpl extends BaseServiceImpl implements + UserLeaveService { - @Autowired - UserLeaveMapper userLeaveMapper; + @Autowired + UserLeaveMapper userLeaveMapper; - @Override - public BaseMapper getMappser() { - return userLeaveMapper; - } + @Override + public List selectListByPage(UserLeave record) { + return userLeaveMapper.selectListByPage(record); + } } diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java index 9fe74d8..e654594 100644 --- a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java +++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java @@ -3,8 +3,10 @@ package org.activiti.rest; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.*; import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricIdentityLink; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.context.Context; @@ -24,6 +26,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author zhuxiaomeng @@ -119,12 +122,28 @@ public class ActivitiService { list.forEach(s -> { String assignee = s.getAssignee(); ActivitiProcess activitiProcess = new ActivitiProcess(); - activitiProcess.setUserId(assignee); - User user = identityService.createUserQuery().userId(assignee).singleResult(); - activitiProcess.setUserName(user.getFirstName()); - activitiProcess.setSid(s.getTaskDefinitionKey()); + //组 + List historicIdentityLinksForTask = historyService.getHistoricIdentityLinksForTask(s.getId()); + List groupName = new ArrayList<>(); + historicIdentityLinksForTask.forEach(hist -> { + List groupList = identityService.createGroupQuery().groupId(hist.getGroupId()).list(); + if (groupList.size() > 0) { + List groupNames = groupList.stream().map(Group::getName).collect(Collectors.toList()); + groupName.addAll(groupNames); + } + }); + activitiProcess.setGroupNames(groupName); + if (!StringUtils.isEmpty(assignee)) { + activitiProcess.setUserId(assignee); + User user = identityService.createUserQuery().userId(assignee).singleResult(); + activitiProcess.setUserName(user.getFirstName()); + activitiProcess.setSid(s.getTaskDefinitionKey()); + } + activitiProcess.setTaskName(s.getName()); - activitiProcess.setTime(simpleDateFormat.format(s.getStartTime())); + if(s.getEndTime()!=null){ + activitiProcess.setTime(simpleDateFormat.format(s.getEndTime())); + } activitiProcesses.add(activitiProcess); }); return activitiProcesses; diff --git a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java index dda59c1..3587148 100644 --- a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java +++ b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @author zhuxiaomeng * @date 2019-03-10. @@ -22,6 +24,9 @@ public class ActivitiProcess { @ApiModelProperty("用户名") String userName; + @ApiModelProperty("组") + List groupNames; + @ApiModelProperty("流程线id") String sid; diff --git a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html index d270897..be31ca3 100644 --- a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html +++ b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html @@ -87,10 +87,22 @@ msg+=`


        审批人:`; - msg+=t.userName; + if(t.userName!==null){ + msg+=t.userName; + } + msg+=`
        审批组:`; + if(t.groupNames){ + t.groupNames.push('aaa'); + t.groupNames.forEach(function(v,index){ + msg+=v; + msg+=(index===t.groupNames.length-1?'':'/'); + }); + } msg+=`
        审批时间:`; - msg+=t.time; + if(t.time!==null) { + msg += t.time; + } msg+=`

        diff --git a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl index 9546d61..703bd1c 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl @@ -8,163 +8,146 @@ To change this template use File | Settings | File Templates.--> - - 新建请假 - - - - - + + 新建请假 + + + + + - - + +
        -
        -
        -
        -
        - 请假信息 -
        -
        -
        - -
        - -
        -
        -
        -
        - -
        - -
        -
        -
        -
        -
        - 原因 -
        -
        -
        -
        - -
        - -
        -
        -
        -
        -
        -
        +
        +
        +
        + 请假信息 +
        +
        +
        + +
        + +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        + 原因 +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        +
        -
        +
        - - -
        -
        - + + +
        +
        +
        diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index b6f9d27..57d5d61 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -95,7 +95,7 @@ } layui.use('table', function () { - var table = layui.table, laydate = layui.laydate; + table = layui.table, laydate = layui.laydate; var a = laydate.render({ elem: '#beginTime', done: function (value, date, endDate) { @@ -200,22 +200,9 @@ } }); eleClick(active, '.len-form-item .layui-btn,.layui-col-md12 .layui-btn'); - }); function add(title, url, w, h) { - if (title == null || title == '') { - title = false; - } - if (url == null || url == '') { - url = "404.html"; - } - if (w == null || w == '') { - w = ($(window).width() * 0.9); - } - if (h == null || h == '') { - h = ($(window).height() - 50); - } window.top.layer.open({ id: 'leave-add', type: 2, diff --git a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl index bd9213d..cbbaf54 100644 --- a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl @@ -83,7 +83,7 @@ } layui.use('table', function () { - var table = layui.table; + table = layui.table; //方法级渲染 table.render({ id: 'taskList', diff --git a/len-activiti/src/main/resources/ftl/actList.ftl b/len-activiti/src/main/resources/ftl/actList.ftl index ee28385..2489d89 100644 --- a/len-activiti/src/main/resources/ftl/actList.ftl +++ b/len-activiti/src/main/resources/ftl/actList.ftl @@ -84,7 +84,7 @@ } layui.use('table', function () { - var table = layui.table; + table = layui.table; //方法级渲染 table.render({ id: 'actList', diff --git a/len-activiti/src/main/resources/ftl/actModelList.ftl b/len-activiti/src/main/resources/ftl/actModelList.ftl index e293250..1bea7eb 100644 --- a/len-activiti/src/main/resources/ftl/actModelList.ftl +++ b/len-activiti/src/main/resources/ftl/actModelList.ftl @@ -96,7 +96,7 @@ } layui.use('table', function () { - var table = layui.table; + table = layui.table; //方法级渲染 table.render({ id: 'actModelList', diff --git a/len-blog/src/main/java/com/len/controller/ArticleController.java b/len-blog/src/main/java/com/len/controller/ArticleController.java index 28bcded..9ab9167 100644 --- a/len-blog/src/main/java/com/len/controller/ArticleController.java +++ b/len-blog/src/main/java/com/len/controller/ArticleController.java @@ -1,5 +1,6 @@ package com.len.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.len.entity.BlogArticle; @@ -13,7 +14,6 @@ import com.len.util.ReType; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import tk.mybatis.mapper.entity.Condition; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; @@ -103,11 +103,10 @@ public class ArticleController { @GetMapping("/article/list/order/read") public ReType getArticleByReadNumber() { - Condition condition = new Condition(BlogArticle.class); + QueryWrapper articleQueryWrapper = new QueryWrapper<>(); + articleQueryWrapper.orderByDesc("readNumber"); PageHelper.startPage(1, 5); - condition.createCriteria(); - condition.orderBy("readNumber").desc(); - List articles = articleService.selectByExample(condition); + List articles = articleService.list(articleQueryWrapper); articles.forEach(s -> { s.setContent(null); String title = s.getTitle(); diff --git a/len-blog/src/main/java/com/len/controller/BlogAdminController.java b/len-blog/src/main/java/com/len/controller/BlogAdminController.java index d14a19f..367f39a 100644 --- a/len-blog/src/main/java/com/len/controller/BlogAdminController.java +++ b/len-blog/src/main/java/com/len/controller/BlogAdminController.java @@ -64,7 +64,7 @@ public class BlogAdminController { @GetMapping("/article/getCategory") public LenResponse getCategory() { LenResponse json = new LenResponse(); - List categories = categoryService.selectAll(); + List categories = categoryService.list(); categories.sort(Comparator.comparing(BlogCategory::getSequence)); json.setData(categories); return json; diff --git a/len-blog/src/main/java/com/len/controller/BlogCategoryController.java b/len-blog/src/main/java/com/len/controller/BlogCategoryController.java index fc43d1e..1341df1 100644 --- a/len-blog/src/main/java/com/len/controller/BlogCategoryController.java +++ b/len-blog/src/main/java/com/len/controller/BlogCategoryController.java @@ -28,7 +28,7 @@ public class BlogCategoryController { @GetMapping("/menu") public List menuList() { - List categories = categoryService.selectAll(); + List categories = categoryService.list(); categories.sort(Comparator.comparing(BlogCategory::getSequence)); List cates = new ArrayList<>(); for (BlogCategory category : categories) { diff --git a/len-blog/src/main/java/com/len/controller/SignController.java b/len-blog/src/main/java/com/len/controller/SignController.java index 97265fc..6550f2b 100644 --- a/len-blog/src/main/java/com/len/controller/SignController.java +++ b/len-blog/src/main/java/com/len/controller/SignController.java @@ -1,5 +1,6 @@ package com.len.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.entity.SysRole; import com.len.entity.SysRoleUser; import com.len.entity.SysUser; @@ -19,7 +20,6 @@ import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import tk.mybatis.mapper.entity.Condition; import java.util.List; import java.util.stream.Collectors; @@ -58,7 +58,8 @@ public class SignController { } String pass = user.getPassword(); user.setPassword(null); - SysUser sysUser = sysUserService.selectOne(user); + QueryWrapper userQueryWrapper = new QueryWrapper<>(user); + SysUser sysUser = sysUserService.getOne(userQueryWrapper); if (sysUser == null) { throw new UnknownAccountException("用户名或密码错误"); } @@ -67,9 +68,9 @@ public class SignController { throw new UnknownAccountException("用户名或密码错误"); } - Condition condition = new Condition(SysRoleUser.class); - condition.createCriteria().andEqualTo("userId", sysUser.getId()); - List sysRoleUsers = roleUserService.selectByExample(condition); + QueryWrapper roleUserQueryWrapper = new QueryWrapper<>(); + roleUserQueryWrapper.eq("userId", sysUser.getId()); + List sysRoleUsers = roleUserService.list(roleUserQueryWrapper); if (sysRoleUsers.isEmpty()) { throw new UnknownAccountException("权限不足"); @@ -79,9 +80,9 @@ public class SignController { .map(SysRoleUser::getRoleId) .collect(Collectors.toList()); - condition = new Condition(SysRole.class); - condition.createCriteria().andIn("id", roleList); - List sysRoles = roleService.selectByExample(condition); + QueryWrapper roleQueryWrapper = new QueryWrapper<>(); + roleQueryWrapper.in("id", roleList); + List sysRoles = roleService.list(roleQueryWrapper); if (roles == null || roles.isEmpty()) { log.error("not init blog roles!"); roles.add(INIT_BLOG_ROLE); diff --git a/len-blog/src/main/java/com/len/controller/TagController.java b/len-blog/src/main/java/com/len/controller/TagController.java index 5e332a1..7b0590c 100644 --- a/len-blog/src/main/java/com/len/controller/TagController.java +++ b/len-blog/src/main/java/com/len/controller/TagController.java @@ -42,7 +42,7 @@ public class TagController extends BaseController { */ @GetMapping("/getTag") public JSONArray label() { - List blogLabels = blogLabelService.selectAll(); + List blogLabels = blogLabelService.list(); JSONArray array = JSONArray.parseArray(JSON.toJSONString(blogLabels)); int i = 0; JSONObject object; diff --git a/len-blog/src/main/java/com/len/entity/ArticleCategory.java b/len-blog/src/main/java/com/len/entity/ArticleCategory.java index 24dacf0..85fb402 100644 --- a/len-blog/src/main/java/com/len/entity/ArticleCategory.java +++ b/len-blog/src/main/java/com/len/entity/ArticleCategory.java @@ -1,25 +1,26 @@ package com.len.entity; -import javax.persistence.Column; -import javax.persistence.Id; -import javax.persistence.Table; -@Table(name = "blog_article_category") +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +@TableName(value = "blog_article_category") public class ArticleCategory { - @Id - @Column(name = "id") + @TableId(value = "id", type = IdType.UUID) private String id; /** * 文章id */ - @Column(name = "article_id") + @TableField(value = "article_id") private String articleId; /** * 标签id */ - @Column(name = "category_id") + @TableField(value = "category_id") private String categoryId; /** diff --git a/len-blog/src/main/java/com/len/entity/ArticleTag.java b/len-blog/src/main/java/com/len/entity/ArticleTag.java index 51635b6..371fb54 100644 --- a/len-blog/src/main/java/com/len/entity/ArticleTag.java +++ b/len-blog/src/main/java/com/len/entity/ArticleTag.java @@ -1,14 +1,16 @@ package com.len.entity; -import javax.persistence.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; -@Table(name = "blog_article_tag") +@TableName(value = "blog_article_tag") public class ArticleTag { - @Id - @Column(name = "article_id") + + @TableId(value = "article_id", type = IdType.UUID) private String articleId; - @Column(name = "tag_id") + @TableId(value = "tag_id", type = IdType.UUID) private String tagId; /** diff --git a/len-blog/src/main/java/com/len/entity/BlogArticle.java b/len-blog/src/main/java/com/len/entity/BlogArticle.java index c3e7754..a66d6d8 100644 --- a/len-blog/src/main/java/com/len/entity/BlogArticle.java +++ b/len-blog/src/main/java/com/len/entity/BlogArticle.java @@ -1,64 +1,70 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; -import javax.persistence.*; -@Table(name = "blog_article") +@TableName(value = "blog_article") @Data public class BlogArticle { - @Id - @Column(name = "id") + + @TableId(value = "id", type = IdType.UUID) private String id; /** * code */ + @TableField(value = "code") private String code; /** * 标题 */ + @TableField(value = "title") private String title; /** * 列表缩略图 */ - @Column(name="first_img") + @TableField(value="first_img") private String firstImg; /** * 阅读次数 */ - @Column(name = "read_number") + @TableField(value = "read_number") private Integer readNumber; /** * 次序(置顶功能) */ - @Column(name = "top_num") + @TableField(value = "top_num") private Integer topNum; - @Column(name = "create_by") + @TableField(value = "create_by") private String createBy; - @Column(name = "update_by") + @TableField(value = "update_by") private String updateBy; - @Column(name = "create_date") + @TableField(value = "create_date") private Date createDate; - @Column(name = "update_date") + @TableField(value = "update_date") private Date updateDate; /** * 文章内容 */ + @TableField(value = "content") private String content; - @Column(name = "del_flag") + @TableField(value = "del_flag") private Byte delFlag; diff --git a/len-blog/src/main/java/com/len/entity/BlogCategory.java b/len-blog/src/main/java/com/len/entity/BlogCategory.java index ba4290a..0c58604 100644 --- a/len-blog/src/main/java/com/len/entity/BlogCategory.java +++ b/len-blog/src/main/java/com/len/entity/BlogCategory.java @@ -1,43 +1,48 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + import java.util.Date; -import javax.persistence.*; -@Table(name = "blog_category") +@TableName(value = "blog_category") public class BlogCategory { - @Id - @Column(name = "id") + @TableId(value = "id", type = IdType.UUID) private String id; - @Column(name="sequence") + @TableField(value="sequence") private Byte sequence; /** * 搜索code */ + @TableField(value="code") private String code; /** * 类别名称 */ + @TableField(value="name") private String name; /** * 上层id(目前最多两次层) */ - @Column(name = "parent_id") + @TableField(value = "parent_id") private String parentId; - @Column(name = "create_by") + @TableField(value = "create_by") private String createBy; - @Column(name = "update_by") + @TableField(value = "update_by") private String updateBy; - @Column(name = "create_date") + @TableField(value = "create_date") private Date createDate; - @Column(name = "update_date") + @TableField(value = "update_date") private Date updateDate; /** diff --git a/len-blog/src/main/java/com/len/entity/BlogTag.java b/len-blog/src/main/java/com/len/entity/BlogTag.java index 36ff137..054713b 100644 --- a/len-blog/src/main/java/com/len/entity/BlogTag.java +++ b/len-blog/src/main/java/com/len/entity/BlogTag.java @@ -1,27 +1,25 @@ package com.len.entity; -import org.apache.ibatis.type.JdbcType; -import tk.mybatis.mapper.annotation.ColumnType; -import tk.mybatis.mapper.annotation.KeySql; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; -import javax.persistence.*; - -@Table(name = "blog_tag") +@TableName(value = "blog_tag") public class BlogTag { - @Id - @Column(name = "id") + @TableId(value = "id", type = IdType.UUID) private String id; /** * 标签code */ - @Column(name = "tag_code") + @TableField(value = "tag_code") private String tagCode; /** * 标签name */ - @Column(name = "tag_name") + @TableField(value = "tag_name") private String tagName; /** diff --git a/len-blog/src/main/java/com/len/mapper/ArticleCategoryMapper.java b/len-blog/src/main/java/com/len/mapper/ArticleCategoryMapper.java index 4f06a88..5ab3fcb 100644 --- a/len-blog/src/main/java/com/len/mapper/ArticleCategoryMapper.java +++ b/len-blog/src/main/java/com/len/mapper/ArticleCategoryMapper.java @@ -6,7 +6,7 @@ import org.apache.ibatis.annotations.Param; import java.util.List; -public interface ArticleCategoryMapper extends BaseMapper { +public interface ArticleCategoryMapper extends BaseMapper { void delByIds(@Param("ids") List ids); } \ No newline at end of file diff --git a/len-blog/src/main/java/com/len/mapper/ArticleTagMapper.java b/len-blog/src/main/java/com/len/mapper/ArticleTagMapper.java index 0cdf53d..94606ca 100644 --- a/len-blog/src/main/java/com/len/mapper/ArticleTagMapper.java +++ b/len-blog/src/main/java/com/len/mapper/ArticleTagMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.ArticleTag; -import tk.mybatis.mapper.common.Mapper; -public interface ArticleTagMapper extends BaseMapper { +public interface ArticleTagMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-blog/src/main/java/com/len/mapper/BlogArticleMapper.java b/len-blog/src/main/java/com/len/mapper/BlogArticleMapper.java index 28d704d..fd95d03 100644 --- a/len-blog/src/main/java/com/len/mapper/BlogArticleMapper.java +++ b/len-blog/src/main/java/com/len/mapper/BlogArticleMapper.java @@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; -public interface BlogArticleMapper extends BaseMapper { +public interface BlogArticleMapper extends BaseMapper { List
        indexSelect(); diff --git a/len-blog/src/main/java/com/len/mapper/BlogCategoryMapper.java b/len-blog/src/main/java/com/len/mapper/BlogCategoryMapper.java index 25157ef..aba8207 100644 --- a/len-blog/src/main/java/com/len/mapper/BlogCategoryMapper.java +++ b/len-blog/src/main/java/com/len/mapper/BlogCategoryMapper.java @@ -3,5 +3,5 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.BlogCategory; -public interface BlogCategoryMapper extends BaseMapper { +public interface BlogCategoryMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-blog/src/main/java/com/len/mapper/BlogTagMapper.java b/len-blog/src/main/java/com/len/mapper/BlogTagMapper.java index 5351610..ce6be1f 100644 --- a/len-blog/src/main/java/com/len/mapper/BlogTagMapper.java +++ b/len-blog/src/main/java/com/len/mapper/BlogTagMapper.java @@ -3,5 +3,5 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.BlogTag; -public interface BlogTagMapper extends BaseMapper { +public interface BlogTagMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-blog/src/main/java/com/len/service/impl/ArticleCategoryServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/ArticleCategoryServiceImpl.java index 29a03a0..e74954a 100644 --- a/len-blog/src/main/java/com/len/service/impl/ArticleCategoryServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/ArticleCategoryServiceImpl.java @@ -22,11 +22,6 @@ public class ArticleCategoryServiceImpl extends BaseServiceImpl getMappser() { - return articleCategoryMapper; - } - @Override public void delByIds(List ids) { articleCategoryMapper.delByIds(ids); diff --git a/len-blog/src/main/java/com/len/service/impl/ArticleTagServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/ArticleTagServiceImpl.java index c2879b5..e35c6dd 100644 --- a/len-blog/src/main/java/com/len/service/impl/ArticleTagServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/ArticleTagServiceImpl.java @@ -18,9 +18,4 @@ public class ArticleTagServiceImpl extends BaseServiceImpl i @Autowired private ArticleTagMapper articleTagMapper; - - @Override - public BaseMapper getMappser() { - return articleTagMapper; - } } diff --git a/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java index 391373b..f4889b6 100644 --- a/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/BlogArticleServiceImpl.java @@ -1,7 +1,7 @@ package com.len.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; -import com.len.base.BaseMapper; import com.len.base.impl.BaseServiceImpl; import com.len.core.LenUser; import com.len.entity.*; @@ -16,7 +16,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import tk.mybatis.mapper.entity.Condition; import java.util.*; import java.util.regex.Matcher; @@ -54,16 +53,13 @@ public class BlogArticleServiceImpl extends BaseServiceImpl private static final Pattern SRC = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)"); - @Override - public BaseMapper getMappser() { - return blogArticleMapper; - } - private ArticleDetail getArticleByCode(String code) { - Condition condition = new Condition(BlogArticle.class); - condition.createCriteria().andEqualTo("code", code) - .andEqualTo("delFlag", 0); - List articles = selectByExample(condition); + + QueryWrapper blogArticleQueryWrapper = new QueryWrapper<>(); + blogArticleQueryWrapper.eq("code", code).eq("delFlag", 0); + blogArticleMapper.selectList(blogArticleQueryWrapper); + List articles = blogArticleMapper.selectList(blogArticleQueryWrapper); + ; if (articles.isEmpty()) { return null; } @@ -77,7 +73,7 @@ public class BlogArticleServiceImpl extends BaseServiceImpl String createBy = blogArticle.getCreateBy(); if (!StringUtils.isEmpty(createBy)) { - SysUser sysUser = sysUserService.selectByPrimaryKey(createBy); + SysUser sysUser = sysUserService.getById(createBy); if (sysUser != null) { article.setCreateName(sysUser.getUsername()); } @@ -87,18 +83,20 @@ public class BlogArticleServiceImpl extends BaseServiceImpl ArticleTag articleTag = new ArticleTag(); articleTag.setArticleId(blogArticle.getId()); - List articleTags = articleTagService.select(articleTag); + QueryWrapper tagQueryWrapper = new QueryWrapper<>(articleTag); + List articleTags = articleTagService.list(tagQueryWrapper); if (!articleTags.isEmpty()) { - condition = new Condition(BlogTag.class); - condition.createCriteria().andIn("id", articleTags.stream() + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", articleTags.stream() .map(ArticleTag::getTagId).collect(Collectors.toList())); - List blogTags = tagService.selectByExample(condition); + List blogTags = tagService.list(queryWrapper); detail.setTags(blogTags.stream().map(BlogTag::getTagCode).collect(Collectors.toList())); } ArticleCategory articleCategory = new ArticleCategory(); articleCategory.setArticleId(blogArticle.getId()); - List articleCategories = articleCategoryService.select(articleCategory); + QueryWrapper blogTagQueryWrapper = new QueryWrapper<>(articleCategory); + List articleCategories = articleCategoryService.list(blogTagQueryWrapper); if (!articleCategories.isEmpty()) { detail.setCategory(articleCategories.stream().map(ArticleCategory::getCategoryId) .collect(Collectors.toList())); @@ -192,7 +190,8 @@ public class BlogArticleServiceImpl extends BaseServiceImpl } BlogArticle article = new BlogArticle(); article.setCode(result.toString()); - BlogArticle blogArticle = selectOne(article); + QueryWrapper articleQueryWrapper = new QueryWrapper<>(article); + BlogArticle blogArticle = blogArticleMapper.selectOne(articleQueryWrapper); if (blogArticle == null) { return result.toString(); } else { @@ -227,7 +226,7 @@ public class BlogArticleServiceImpl extends BaseServiceImpl BlogArticle blogArticle = new BlogArticle(); BeanUtil.copyNotNullBean(article, blogArticle); - int result = insert(blogArticle); + int result = blogArticleMapper.insert(blogArticle); List categories = new ArrayList<>(); for (String cateId : articleDetail.getCategory()) { @@ -237,7 +236,7 @@ public class BlogArticleServiceImpl extends BaseServiceImpl articleCategory.setCategoryId(cateId); categories.add(articleCategory); } - int insertResult = articleCategoryService.insertList(categories); + boolean insertResult = articleCategoryService.saveBatch(categories); List articleTags = new ArrayList<>(); List blogTags = new ArrayList<>(); @@ -252,7 +251,8 @@ public class BlogArticleServiceImpl extends BaseServiceImpl blogTag = new BlogTag(); blogTag.setTagCode(tag); - oldTag = tagService.selectOne(blogTag); + QueryWrapper blogTagQueryWrapper = new QueryWrapper<>(blogTag); + oldTag = tagService.getOne(blogTagQueryWrapper); if (oldTag != null) { articleTag.setTagId(oldTag.getId()); @@ -264,12 +264,12 @@ public class BlogArticleServiceImpl extends BaseServiceImpl articleTag.setTagId(id); } } - articleTagService.insertList(articleTags); + articleTagService.saveBatch(articleTags); if (!blogTags.isEmpty()) { - tagService.insertList(blogTags); + tagService.saveBatch(blogTags); } - return result > 0 && insertResult > 0; + return result > 0 && insertResult; } @Override @@ -292,11 +292,11 @@ public class BlogArticleServiceImpl extends BaseServiceImpl } BlogArticle blogArticle = new BlogArticle(); BeanUtil.copyNotNullBean(article, blogArticle); - updateByPrimaryKey(blogArticle); + blogArticleMapper.updateById(blogArticle); ArticleTag articleTag = new ArticleTag(); articleTag.setArticleId(article.getId()); - articleTagService.delete(articleTag); + articleTagService.removeById(article.getId()); List articleTags = new ArrayList<>(); List blogTags = new ArrayList<>(); @@ -307,7 +307,8 @@ public class BlogArticleServiceImpl extends BaseServiceImpl articleTag.setArticleId(article.getId()); BlogTag blogTag = new BlogTag(); blogTag.setTagCode(tag); - BlogTag tag1 = tagService.selectOne(blogTag); + QueryWrapper blogTagQueryWrapper = new QueryWrapper<>(blogTag); + BlogTag tag1 = tagService.getOne(blogTagQueryWrapper); if (tag1 != null) { articleTag.setTagId(tag1.getId()); } else { @@ -322,13 +323,14 @@ public class BlogArticleServiceImpl extends BaseServiceImpl } } if (!blogTags.isEmpty()) { - tagService.insertList(blogTags); + tagService.saveBatch(blogTags); } - articleTagService.insertList(articleTags); + articleTagService.saveBatch(articleTags); ArticleCategory articleCategory = new ArticleCategory(); articleCategory.setArticleId(article.getId()); - List categories = articleCategoryService.select(articleCategory); + QueryWrapper categoryQueryWrapper = new QueryWrapper<>(articleCategory); + List categories = articleCategoryService.list(categoryQueryWrapper); if (!categories.isEmpty()) { List cateIds = categories.stream().map(ArticleCategory::getCategoryId) .collect(Collectors.toList()); @@ -353,7 +355,7 @@ public class BlogArticleServiceImpl extends BaseServiceImpl category.setArticleId(article.getId()); category.setCategoryId(ca); } - articleCategoryService.insertList(articleCategories); + articleCategoryService.saveBatch(articleCategories); } return true; } @@ -369,9 +371,9 @@ public class BlogArticleServiceImpl extends BaseServiceImpl if (!StringUtils.isBlank(str)) { if (StringUtils.isEmpty(redisService.get(str))) { redisService.set(str, "true", 60 * 30L); - BlogArticle article = selectByPrimaryKey(articleId); + BlogArticle article = blogArticleMapper.selectById(articleId); article.setReadNumber(article.getReadNumber() + 1); - updateByPrimaryKey(article); + blogArticleMapper.updateById(article); return article.getReadNumber(); } } diff --git a/len-blog/src/main/java/com/len/service/impl/BlogCategoryServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/BlogCategoryServiceImpl.java index fbed9e1..cc1e5fc 100644 --- a/len-blog/src/main/java/com/len/service/impl/BlogCategoryServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/BlogCategoryServiceImpl.java @@ -16,11 +16,4 @@ import org.springframework.stereotype.Service; @Service public class BlogCategoryServiceImpl extends BaseServiceImpl implements BlogCategoryService { - @Autowired - private BlogCategoryMapper blogCategoryMapper; - - @Override - public BaseMapper getMappser() { - return blogCategoryMapper; - } } diff --git a/len-blog/src/main/java/com/len/service/impl/BlogTagServiceImpl.java b/len-blog/src/main/java/com/len/service/impl/BlogTagServiceImpl.java index b291260..96b8301 100644 --- a/len-blog/src/main/java/com/len/service/impl/BlogTagServiceImpl.java +++ b/len-blog/src/main/java/com/len/service/impl/BlogTagServiceImpl.java @@ -1,11 +1,8 @@ package com.len.service.impl; -import com.len.base.BaseMapper; import com.len.base.impl.BaseServiceImpl; import com.len.entity.BlogTag; -import com.len.mapper.BlogTagMapper; import com.len.service.BlogTagService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -15,12 +12,4 @@ import org.springframework.stereotype.Service; */ @Service public class BlogTagServiceImpl extends BaseServiceImpl implements BlogTagService { - - @Autowired - private BlogTagMapper blogTagMapper; - - @Override - public BaseMapper getMappser() { - return blogTagMapper; - } } diff --git a/len-core/src/main/java/com/len/base/AbstractEntity.java b/len-core/src/main/java/com/len/base/AbstractEntity.java new file mode 100644 index 0000000..dd40ac4 --- /dev/null +++ b/len-core/src/main/java/com/len/base/AbstractEntity.java @@ -0,0 +1,27 @@ +package com.len.base; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.util.Date; + +/** + * @author zxm + * @date 2019-11-12. + */ +@Data +public class AbstractEntity { + + @TableId(type = IdType.UUID) + private String id; + + private String createBy; + + private Date createDate; + + private String updateBy; + + private Date updateDate; +} diff --git a/len-core/src/main/java/com/len/base/BaseMapper.java b/len-core/src/main/java/com/len/base/BaseMapper.java index 0dde51e..342e1f9 100644 --- a/len-core/src/main/java/com/len/base/BaseMapper.java +++ b/len-core/src/main/java/com/len/base/BaseMapper.java @@ -1,8 +1,8 @@ package com.len.base; -import tk.mybatis.mapper.common.IdsMapper; -import java.io.Serializable; +import com.len.util.ReType; + import java.util.List; /** @@ -11,59 +11,13 @@ import java.util.List; * @email 154040976@qq.com * mapper封装 crud */ -public interface BaseMapper extends tk.mybatis.mapper.common.Mapper, LenInsertListAndinsertUseGeneratedKeysMapper, IdsMapper { - /* - *//** - * 根据id删除 - * @param id - * @return - *//* - int deleteByPrimaryKey(E id); - - *//** - * 插入 - * @param record - * @return - *//* - int insert(T record); - - *//** - *插入非空字段 - * @param record - * @return - *//* - int insertSelective(T record); - - *//** - * 根据id查询 - * @param id - * @return - *//* - T selectByPrimaryKey(E id); - - *//** - * 更新非空数据 - * @param record - * @return - *//* - int updateByPrimaryKeySelective(T record); - - *//** - * 更新 - * @param record - * @return - *//* - int updateByPrimaryKey(T record); +public interface BaseMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper { - */ + public List selectListByPage(T record); - /** - * 查询 - * - * @param record - * @return - */ + public ReType show(T t, int page, int limit); + public ReType getList(T t, int page, int limit); - List selectListByPage(T record); + public String showAll(T t); } diff --git a/len-core/src/main/java/com/len/base/BaseService.java b/len-core/src/main/java/com/len/base/BaseService.java index 263bf0e..d4c248f 100644 --- a/len-core/src/main/java/com/len/base/BaseService.java +++ b/len-core/src/main/java/com/len/base/BaseService.java @@ -1,7 +1,7 @@ package com.len.base; +import com.baomidou.mybatisplus.extension.service.IService; import com.len.util.ReType; -import org.apache.ibatis.session.RowBounds; import java.io.Serializable; import java.util.List; @@ -12,59 +12,7 @@ import java.util.List; * @email 154040976@qq.com * 通用service层 */ -public interface BaseService { - - public List select(T t); - - public List selectAll(); - - public List selectByIds(String ids); - - public int selectCount(T t); - - public int deleteByPrimaryKey(E id); - - public int insert(T record); - - public int insertSelective(T record); - - public int updateByPrimaryKeySelective(T record); - - public int updateByPrimaryKey(T record); - - public List selectListByPage(T record); - - public int deleteByPrimaryKey(Object o); - - public int delete(T t); - - public boolean existsWithPrimaryKey(Object o); - - public T selectByPrimaryKey(Object o); - - public T selectOne(T t); - - public int deleteByIds(String s); - - public int insertList(List list); - - public int insertUseGeneratedKeys(T t); - - public int deleteByExample(Object o); - - public List selectByExample(Object o); - - public int selectCountByExample(Object o); - - public T selectOneByExample(Object o); - - public int updateByExample(T t, Object o); - - public int updateByExampleSelective(T t, Object o); - - public List selectByExampleAndRowBounds(Object o, RowBounds rowBounds); - - public List selectByRowBounds(T t, RowBounds rowBounds); +public interface BaseService extends IService { public ReType show(T t, int page, int limit); diff --git a/len-core/src/main/java/com/len/base/LenInsertListAndinsertUseGeneratedKeysMapper.java b/len-core/src/main/java/com/len/base/LenInsertListAndinsertUseGeneratedKeysMapper.java deleted file mode 100644 index d6bed39..0000000 --- a/len-core/src/main/java/com/len/base/LenInsertListAndinsertUseGeneratedKeysMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.len.base; - -import org.apache.ibatis.annotations.InsertProvider; -import org.apache.ibatis.annotations.Options; - -import java.util.List; - -/** - * @author zhuxiaomeng - * @date 2018/10/12. - * @email 154040976@qq.com - */ -@tk.mybatis.mapper.annotation.RegisterMapper -public interface LenInsertListAndinsertUseGeneratedKeysMapper { - - @Options(useGeneratedKeys = true, keyProperty = "id") - @InsertProvider(type = MySpecialProvider.class, method = "dynamicSQL") - int insertList(List recordList); - - @Options(useGeneratedKeys = true, keyProperty = "id") - @InsertProvider(type = MySpecialProvider.class, method = "dynamicSQL") - int insertUseGeneratedKeys(T record); -} diff --git a/len-core/src/main/java/com/len/base/MySpecialProvider.java b/len-core/src/main/java/com/len/base/MySpecialProvider.java deleted file mode 100644 index 53b1fd1..0000000 --- a/len-core/src/main/java/com/len/base/MySpecialProvider.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.len.base; - -import org.apache.ibatis.mapping.MappedStatement; -import tk.mybatis.mapper.entity.EntityColumn; -import tk.mybatis.mapper.entity.EntityTable; -import tk.mybatis.mapper.mapperhelper.EntityHelper; -import tk.mybatis.mapper.mapperhelper.MapperHelper; -import tk.mybatis.mapper.mapperhelper.MapperTemplate; -import tk.mybatis.mapper.mapperhelper.SqlHelper; - -import java.util.Set; - -/** - * @author zhuxiaomeng - * @date 2018/10/12 - * @email 154040976@qq.com - * 重写 SpecialProvider 使得批量方法支持主键自增和自定义自增 (仅测试了mysql) - */ -public class MySpecialProvider extends MapperTemplate { - public MySpecialProvider(Class mapperClass, MapperHelper mapperHelper) { - super(mapperClass, mapperHelper); - } - - - public String insertList(MappedStatement ms) { - final Class entityClass = getEntityClass(ms); - //开始拼sql - StringBuilder sql = new StringBuilder(); - sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass))); - boolean keyIsAuto = keyIsAuto(entityClass); - sql.append(SqlHelper.insertColumns(entityClass, keyIsAuto, false, false)); - sql.append(" VALUES "); - sql.append(""); - sql.append(""); - //获取全部列 - Set columnList = EntityHelper.getColumns(entityClass); - - for (EntityColumn column : columnList) { - if (column.isId() && column.isInsertable()) { - if (!keyIsAuto) { - sql.append(column.getColumnHolder("record")).append(","); - } - } else if (column.isInsertable()) { - sql.append(column.getColumnHolder("record")).append(","); - } - } - sql.append(""); - sql.append(""); - return sql.toString(); - } - - /** - * 调用insertList insertUseGeneratedKeys - * 判断是否为 自增主键 当@GeneratedValue(generator = "JDBC") 为主键自增 删除此注解为自定义 - * - * @param entityClass 当前实体 - * @return 是否为自增主键 true 是 false 否 - */ - private boolean keyIsAuto(Class entityClass) { - EntityTable entityTable = EntityHelper.getEntityTable(entityClass); - entityTable.getEntityClassColumns(); - Set entityClassPKColumns = entityTable.getEntityClassPKColumns(); - for (EntityColumn entityColumn : entityClassPKColumns) { - String generator = entityColumn.getGenerator(); - if ("JDBC".equals(generator)) { - return true; - } - } - return false; - } - - public String insertUseGeneratedKeys(MappedStatement ms) { - final Class entityClass = getEntityClass(ms); - //开始拼sql - StringBuilder sql = new StringBuilder(); - sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass))); - boolean keyIsAuto = keyIsAuto(entityClass); - sql.append(SqlHelper.insertColumns(entityClass, keyIsAuto, false, false)); - sql.append(SqlHelper.insertValuesColumns(entityClass, keyIsAuto, false, false)); - return sql.toString(); - } -} diff --git a/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java b/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java new file mode 100644 index 0000000..015d033 --- /dev/null +++ b/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java @@ -0,0 +1,71 @@ +package com.len.base.impl; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.len.base.BaseMapper; +import com.len.base.BaseService; +import com.len.exception.MyException; +import com.len.util.ReType; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.util.List; + +/** + * @author zhuxiaomeng + * @date 2017/12/13. + * @email 154040976@qq.com + * update by 2019/11/12 tkmapper替换成mybatisplus + */ +@Slf4j +public class AbstractServiceImpl extends ServiceImpl, T> implements BaseService { + + + /** + * 公共展示类 + * + * @param t 实体 + * @param page 页 + * @param limit 行 + * @return + */ + @Override + public ReType show(T t, int page, int limit) { + List tList = null; + Page tPage = PageHelper.startPage(page, limit); + try { + tList = getBaseMapper().selectListByPage(t); + } catch (MyException e) { + log.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); + e.printStackTrace(); + } + return new ReType(tPage.getTotal(), tList); + } + + @Override + public String showAll(T t) { + List tList = null; + try { + tList = getBaseMapper().selectListByPage(t); + } catch (MyException e) { + log.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); + e.printStackTrace(); + } + return JSON.toJSONString(tList); + } + + @Override + public ReType getList(T t, int page, int limit) { + List tList = null; + Page tPage = PageHelper.startPage(page, limit); + try { + tList = getBaseMapper().selectListByPage(t); + } catch (MyException e) { + log.error("class:BaseServiceImpl ->method:getList->message:" + e.getMessage()); + e.printStackTrace(); + } + return new ReType(tPage.getTotal(), tPage.getPageNum(), tList); + } +} diff --git a/len-core/src/main/java/com/len/base/impl/BaseServiceImpl.java b/len-core/src/main/java/com/len/base/impl/BaseServiceImpl.java index a902e40..5a61de2 100644 --- a/len-core/src/main/java/com/len/base/impl/BaseServiceImpl.java +++ b/len-core/src/main/java/com/len/base/impl/BaseServiceImpl.java @@ -1,301 +1,16 @@ package com.len.base.impl; -import com.alibaba.fastjson.JSON; -import com.github.pagehelper.Page; -import com.github.pagehelper.PageHelper; -import com.len.base.BaseMapper; -import com.len.base.BaseService; -import com.len.base.CurrentUser; -import com.len.exception.MyException; -import com.len.util.ReType; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.session.RowBounds; -import org.apache.shiro.SecurityUtils; import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.Date; -import java.util.List; -import java.util.UUID; /** * @author zhuxiaomeng * @date 2017/12/13. * @email 154040976@qq.com + * update by 2019/11/12 tkmapper替换成mybatisplus */ @Slf4j -public abstract class BaseServiceImpl implements BaseService { +public class BaseServiceImpl extends AbstractServiceImpl { - /** - * general field(通用字段) - */ - private static final String CREATE_BY = "createBy"; - - private static final String CREATE_DATE = "createDate"; - - private static final String UPDATE_BY = "updateBy"; - - private static final String UPDATE_DATE = "updateDate"; - - //系统默认 id 如果主键为其他字段 则需要自己手动 生成 写入 id - private static final String ID = "id"; - - private static final String STR = "java.lang.String"; - - - public abstract BaseMapper getMappser(); - - - @Override - public List select(T t) { - return getMappser().select(t); - } - - @Override - public List selectAll() { - return getMappser().selectAll(); - } - - @Override - public List selectByIds(String ids) { - return getMappser().selectByIds(ids); - } - - @Override - public int selectCount(T t) { - return getMappser().selectCount(t); - } - - - @Override - public int deleteByPrimaryKey(E id) { - return getMappser().deleteByPrimaryKey(id); - } - - @Override - public int insert(T record) { - try { - record = addValue(record, true); - }catch (Exception e){ - - } - return getMappser().insert(record); - } - - /** - * 通用注入创建 更新信息 可通过super调用 - * - * @param record - * @param flag - * @return - */ - public T addValue(T record, boolean flag) { - CurrentUser currentUser = (CurrentUser) SecurityUtils.getSubject().getSession().getAttribute("currentPrincipal"); - //统一处理公共字段 - Class clazz = record.getClass(); - String operator, operateDate; - try { - if (flag) { - //添加 id uuid支持 - Field idField = clazz.getDeclaredField(ID); - idField.setAccessible(true); - Object o = idField.get(record); - Class type = idField.getType(); - String name = type.getName(); - if ((o == null) && STR.equals(name)) { - //已经有值的情况下 不覆盖 - idField.set(record, UUID.randomUUID().toString().replace("-", "").toLowerCase()); - } - operator = CREATE_BY; - operateDate = CREATE_DATE; - } else { - operator = UPDATE_BY; - operateDate = UPDATE_DATE; - } - Field field = clazz.getDeclaredField(operator); - field.setAccessible(true); - field.set(record, currentUser.getId()); - Field fieldDate = clazz.getDeclaredField(operateDate); - fieldDate.setAccessible(true); - fieldDate.set(record, new Date()); - - } catch (NoSuchFieldException e) { - //无此字段 - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return record; - } - - @Override - public int insertSelective(T record) { - try { - record = addValue(record, true); - }catch (Exception e){ - } - return getMappser().insertSelective(record); - } - - - @Override - public int updateByPrimaryKeySelective(T record) { - try { - record = addValue(record, false); - }catch (Exception e){ - - } - return getMappser().updateByPrimaryKeySelective(record); - } - - @Override - public int updateByPrimaryKey(T record) { - try { - record = addValue(record, false); - }catch (Exception e){ - - } - return getMappser().updateByPrimaryKey(record); - } - - @Override - public List selectListByPage(T record) { - return getMappser().selectListByPage(record); - } - - @Override - public int deleteByPrimaryKey(Object o) { - return getMappser().deleteByPrimaryKey(o); - } - - @Override - public int delete(T t) { - return getMappser().delete(t); - } - - @Override - public boolean existsWithPrimaryKey(Object o) { - return getMappser().existsWithPrimaryKey(o); - } - - @Override - public T selectByPrimaryKey(Object o) { - return getMappser().selectByPrimaryKey(o); - } - - @Override - public T selectOne(T t) { - return getMappser().selectOne(t); - } - - @Override - public int deleteByIds(String s) { - return getMappser().deleteByIds(s); - } - - @Override - public int insertList(List list) { - return getMappser().insertList(list); - } - - @Override - public int insertUseGeneratedKeys(T t) { - return getMappser().insertUseGeneratedKeys(t); - } - - /** - * 公共展示类 - * - * @param t 实体 - * @param page 页 - * @param limit 行 - * @return - */ - @Override - public ReType show(T t, int page, int limit) { - List tList = null; - Page tPage = PageHelper.startPage(page, limit); - try { - tList = getMappser().selectListByPage(t); - } catch (MyException e) { - log.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); - e.printStackTrace(); - } - return new ReType(tPage.getTotal(), tList); - } - - @Override - public String showAll(T t) - { - List tList = null; - try { - tList = getMappser().selectListByPage(t); - } catch (MyException e) { -// logger.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); - log.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); - e.printStackTrace(); - } -// ReType reType = new ReType( tList); - return JSON.toJSONString(tList); - } - - @Override - public ReType getList(T t, int page, int limit) { - List tList = null; - Page tPage = PageHelper.startPage(page, limit); - try { - tList = getMappser().selectListByPage(t); - } catch (MyException e) { - log.error("class:BaseServiceImpl ->method:getList->message:" + e.getMessage()); - e.printStackTrace(); - } - return new ReType(tPage.getTotal(),tPage.getPageNum(), tList); - } - - - @Override - public int deleteByExample(Object o) { - return getMappser().deleteByExample(o); - } - - - @Override - public List selectByExample(Object o) { - return getMappser().selectByExample(o); - } - - - @Override - public int selectCountByExample(Object o) { - return getMappser().selectCountByExample(o); - } - - - @Override - public T selectOneByExample(Object o) { - return getMappser().selectOneByExample(o); - } - - - @Override - public int updateByExample(T t, Object o) { - return getMappser().updateByExample(t,o); - } - - - @Override - public int updateByExampleSelective(T t, Object o) { - return getMappser().updateByExampleSelective(t,o); - } - - - @Override - public List selectByExampleAndRowBounds(Object o, RowBounds rowBounds) { - return getMappser().selectByExampleAndRowBounds(o,rowBounds); - } - - - @Override - public List selectByRowBounds(T t, RowBounds rowBounds) { - return getMappser().selectByRowBounds(t,rowBounds); - } } diff --git a/len-core/src/main/java/com/len/util/UuidUtil.java b/len-core/src/main/java/com/len/util/UuidUtil.java new file mode 100644 index 0000000..3e01fe1 --- /dev/null +++ b/len-core/src/main/java/com/len/util/UuidUtil.java @@ -0,0 +1,14 @@ +package com.len.util; + +import java.util.UUID; + +/** + * @author zxm + * @date 2019-11-15. + */ +public class UuidUtil { + + public static String getUuid() { + return UUID.randomUUID().toString().replace("-", "").toLowerCase(); + } +} diff --git a/len-sys/src/main/java/com/len/controller/JobController.java b/len-sys/src/main/java/com/len/controller/JobController.java index f09f595..fd2127d 100644 --- a/len-sys/src/main/java/com/len/controller/JobController.java +++ b/len-sys/src/main/java/com/len/controller/JobController.java @@ -66,7 +66,7 @@ public class JobController extends BaseController { String msg = "保存成功"; job.setStatus(false); try { - jobService.insertSelective(job); + jobService.save(job); } catch (MyException e) { msg = "保存失败"; j.setFlag(false); @@ -79,7 +79,7 @@ public class JobController extends BaseController { @GetMapping(value = "updateJob") public String updateJob(String id, Model model, boolean detail) { if (StringUtils.isNotEmpty(id)) { - SysJob job = jobService.selectByPrimaryKey(id); + SysJob job = jobService.getById(id); model.addAttribute("job", job); } model.addAttribute("detail", detail); diff --git a/len-sys/src/main/java/com/len/controller/LogController.java b/len-sys/src/main/java/com/len/controller/LogController.java index 8b7503e..1f2154a 100644 --- a/len-sys/src/main/java/com/len/controller/LogController.java +++ b/len-sys/src/main/java/com/len/controller/LogController.java @@ -76,7 +76,7 @@ public class LogController extends BaseController { String msg = "删除成功"; try { for (String id : ids) { - logMapper.deleteByPrimaryKey(Integer.valueOf(id)); + logMapper.deleteById(Integer.valueOf(id)); } } catch (MyException e) { msg = "删除失败"; diff --git a/len-sys/src/main/java/com/len/controller/LoginController.java b/len-sys/src/main/java/com/len/controller/LoginController.java index b7dcb25..226ba40 100644 --- a/len-sys/src/main/java/com/len/controller/LoginController.java +++ b/len-sys/src/main/java/com/len/controller/LoginController.java @@ -78,10 +78,10 @@ public class LoginController { @PostMapping(value = "/login") public String login(SysUser user, Model model, String rememberMe, HttpServletRequest request) { String codeMsg = (String) request.getAttribute("shiroLoginFailure"); - if (CODE_ERROR.equals(codeMsg)) { + /*if (CODE_ERROR.equals(codeMsg)) { model.addAttribute("message", "验证码错误"); return "/login2"; - } + }*/ CustomUsernamePasswordToken token = new CustomUsernamePasswordToken(user.getUsername().trim(), user.getPassword(), "UserLogin"); Subject subject = Principal.getSubject(); diff --git a/len-sys/src/main/java/com/len/controller/MenuController.java b/len-sys/src/main/java/com/len/controller/MenuController.java index 605fbe8..32f2011 100644 --- a/len-sys/src/main/java/com/len/controller/MenuController.java +++ b/len-sys/src/main/java/com/len/controller/MenuController.java @@ -82,7 +82,7 @@ public class MenuController extends BaseController { if (sysMenu.getMenuType() == 2) { sysMenu.setMenuType((byte) 0); } - menuService.insertSelective(sysMenu); + menuService.save(sysMenu); lenResponse.setMsg("添加成功"); } catch (MyException e) { e.printStackTrace(); @@ -93,12 +93,12 @@ public class MenuController extends BaseController { @GetMapping(value = "showUpdateMenu") public String showUpdateMenu(Model model, String id) { - SysMenu sysMenu = menuService.selectByPrimaryKey(id); + SysMenu sysMenu = menuService.getById(id); JSONArray ja = menuService.getMenuJsonList(); model.addAttribute("menus", ja.toJSONString()); model.addAttribute("sysMenu", sysMenu); if (null != sysMenu.getPId()) { - SysMenu pSysMenu = menuService.selectByPrimaryKey(sysMenu.getPId()); + SysMenu pSysMenu = menuService.getById(sysMenu.getPId()); model.addAttribute("pName", pSysMenu.getName()); } return "/system/menu/update-menu"; @@ -109,9 +109,9 @@ public class MenuController extends BaseController { @PostMapping(value = "updateMenu") @ResponseBody public LenResponse updateMenu(SysMenu sysMenu) { - SysMenu oldMenu = menuService.selectByPrimaryKey(sysMenu.getId()); + SysMenu oldMenu = menuService.getById(sysMenu.getId()); BeanUtil.copyNotNullBean(sysMenu, oldMenu); - menuService.updateByPrimaryKeySelective(oldMenu); + menuService.updateById(oldMenu); return LenResponse.sucess("保存成功"); } diff --git a/len-sys/src/main/java/com/len/controller/PersonController.java b/len-sys/src/main/java/com/len/controller/PersonController.java index d2131c5..eae6c6d 100644 --- a/len-sys/src/main/java/com/len/controller/PersonController.java +++ b/len-sys/src/main/java/com/len/controller/PersonController.java @@ -33,6 +33,11 @@ public class PersonController { @Autowired SysUserService userService; + @GetMapping("/index") + public String main(){ + return "/main/index"; + } + @GetMapping() public String toPerson(Model model) { CurrentUser principal = Principal.getPrincipal(); @@ -42,7 +47,7 @@ public class PersonController { String id = principal.getId(); List checkboxList = userService.getUserRoleByJson(id); - SysUser user = userService.selectByPrimaryKey(id); + SysUser user = userService.getById(id); model.addAttribute("user", user); return "/system/person/me"; } @@ -58,9 +63,9 @@ public class PersonController { jsonUtil.setMsg("获取数据失败"); return jsonUtil; } - SysUser oldUser = userService.selectByPrimaryKey(user.getId()); + SysUser oldUser = userService.getById(user.getId()); BeanUtil.copyNotNullBean(user, oldUser); - userService.updateByPrimaryKeySelective(oldUser); + userService.updateById(oldUser); jsonUtil.setFlag(true); jsonUtil.setMsg("修改成功"); userService.updateCurrent(user); diff --git a/len-sys/src/main/java/com/len/controller/RoleController.java b/len-sys/src/main/java/com/len/controller/RoleController.java index 8745de7..2fb6b99 100644 --- a/len-sys/src/main/java/com/len/controller/RoleController.java +++ b/len-sys/src/main/java/com/len/controller/RoleController.java @@ -86,7 +86,7 @@ public class RoleController extends BaseController { @GetMapping(value = "updateRole") public String updateRole(String id, Model model, boolean detail) { if (StringUtils.isNotEmpty(id)) { - SysRole role = roleService.selectByPrimaryKey(id); + SysRole role = roleService.getById(id); model.addAttribute("role", role); JSONArray jsonArray = menuService.getTreeUtil(id); model.addAttribute("menus", jsonArray.toJSONString()); diff --git a/len-sys/src/main/java/com/len/controller/UserController.java b/len-sys/src/main/java/com/len/controller/UserController.java index 42e7995..3d5db9b 100644 --- a/len-sys/src/main/java/com/len/controller/UserController.java +++ b/len-sys/src/main/java/com/len/controller/UserController.java @@ -114,12 +114,12 @@ public class UserController extends BaseController { } LenResponse j = new LenResponse(); try { - userService.insertSelective(user); + userService.save(user); SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(user.getId()); for (String r : role) { sysRoleUser.setRoleId(r); - roleUserService.insertSelective(sysRoleUser); + roleUserService.save(sysRoleUser); } j.setMsg("保存成功"); } catch (MyException e) { @@ -135,7 +135,7 @@ public class UserController extends BaseController { if (StringUtils.isNotEmpty(id)) { //用户-角色 List checkboxList = userService.getUserRoleByJson(id); - SysUser user = userService.selectByPrimaryKey(id); + SysUser user = userService.getById(id); model.addAttribute("user", user); model.addAttribute("boxJson", checkboxList); } @@ -155,20 +155,21 @@ public class UserController extends BaseController { return jsonUtil; } try { - SysUser oldUser = userService.selectByPrimaryKey(user.getId()); + SysUser oldUser = userService.getById(user.getId()); BeanUtil.copyNotNullBean(user, oldUser); - userService.updateByPrimaryKeySelective(oldUser); + userService.updateById(oldUser); SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(oldUser.getId()); List keyList = userService.selectByCondition(sysRoleUser); - for (SysRoleUser sysRoleUser1 : keyList) { - roleUserService.deleteByPrimaryKey(sysRoleUser1); + for (SysRoleUser currentRoleUser : keyList) { + roleUserService.removeById(currentRoleUser.getId()); } if (role != null) { for (String r : role) { sysRoleUser.setRoleId(r); - roleUserService.insert(sysRoleUser); + sysRoleUser.setId(UuidUtil.getUuid()); + roleUserService.save(sysRoleUser); } } jsonUtil.setFlag(true); @@ -194,7 +195,7 @@ public class UserController extends BaseController { if (StringUtils.isEmpty(id)) { return "获取账户信息失败"; } - SysUser user = userService.selectByPrimaryKey(id); + SysUser user = userService.getById(id); model.addAttribute("user", user); return "/system/user/re-pass"; } @@ -219,7 +220,7 @@ public class UserController extends BaseController { j.setMsg("获取数据失败,修改失败"); return j; } - SysUser user = userService.selectByPrimaryKey(id); + SysUser user = userService.getById(id); newPwd = Md5Util.getMD5(newPwd, user.getUsername()); pass = Md5Util.getMD5(pass, user.getUsername()); if (!pass.equals(user.getPassword())) { diff --git a/len-sys/src/main/java/com/len/core/BootListener/DataSourceJobThread.java b/len-sys/src/main/java/com/len/core/BootListener/DataSourceJobThread.java index 9b7d558..3a8e543 100644 --- a/len-sys/src/main/java/com/len/core/BootListener/DataSourceJobThread.java +++ b/len-sys/src/main/java/com/len/core/BootListener/DataSourceJobThread.java @@ -1,5 +1,6 @@ package com.len.core.BootListener; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.core.quartz.JobTask; import com.len.entity.SysJob; import com.len.service.JobService; @@ -39,7 +40,8 @@ public class DataSourceJobThread extends Thread { JobTask jobTask = SpringUtil.getBean("jobTask"); SysJob job = new SysJob(); job.setStatus(true); - List jobList = jobService.selectListByPage(job); + QueryWrapper jobQueryWrapper=new QueryWrapper<>(job); + List jobList = jobService.list(jobQueryWrapper); //开启任务 jobList.forEach(jobs -> { log.info("---任务[" + jobs.getId() + "]系统 init--开始启动---------"); @@ -48,8 +50,9 @@ public class DataSourceJobThread extends Thread { ); if (jobList.size() == 0) { log.info("---数据库暂无启动的任务---------"); - } else + } else { System.out.println("---任务启动完毕---------"); + } } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/len-sys/src/main/java/com/len/core/annotation/LogAspect.java b/len-sys/src/main/java/com/len/core/annotation/LogAspect.java index c584d09..6675b95 100644 --- a/len-sys/src/main/java/com/len/core/annotation/LogAspect.java +++ b/len-sys/src/main/java/com/len/core/annotation/LogAspect.java @@ -9,6 +9,7 @@ import com.len.util.IpUtil; import java.lang.reflect.Method; import java.util.Date; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.shiro.UnavailableSecurityManagerException; diff --git a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo1.java b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo1.java index 81fcfb3..985a246 100644 --- a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo1.java +++ b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo1.java @@ -36,7 +36,7 @@ public class JobDemo1 implements Job{ ApplicationContext applicationContext=SpringUtil.getApplicationContext(); //可以 获取 //SysUserService sys=SpringUtil.getBean(SysUserServiceImpl.class); - List userList=sys.selectListByPage(new SysUser()); + List userList=sys.list(); System.out.println(userList.get(0).getUsername());; System.out.println("JobDemo1:执行完毕======================="); diff --git a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo2.java b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo2.java index d4a8e7c..69dba5b 100644 --- a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo2.java +++ b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo2.java @@ -38,7 +38,7 @@ public class JobDemo2 implements Job{ public void run(){ ApplicationContext applicationContext=SpringUtil.getApplicationContext(); SysUserService sys=SpringUtil.getBean(SysUserServiceImpl.class); - List userList=sys.selectListByPage(new SysUser()); + List userList=sys.list(); log.info(userList.get(0).getUsername()); log.info("JobDemo2:执行完毕======================="); } diff --git a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo3.java b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo3.java index f07895d..5d27a48 100644 --- a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo3.java +++ b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo3.java @@ -33,7 +33,7 @@ public class JobDemo3 implements Job{ public void run(){ ApplicationContext applicationContext=SpringUtil.getApplicationContext(); SysUserService sys=SpringUtil.getBean(SysUserServiceImpl.class); - List userList=sys.selectListByPage(new SysUser()); + List userList=sys.list(); System.out.println(userList.get(0).getUsername());; System.out.println("JobDemo3:执行完毕======================="); diff --git a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo4.java b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo4.java index c2e3c65..fe17d81 100644 --- a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo4.java +++ b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo4.java @@ -33,7 +33,7 @@ public class JobDemo4 implements Job{ public void run(){ ApplicationContext applicationContext=SpringUtil.getApplicationContext(); SysUserService sys=SpringUtil.getBean(SysUserServiceImpl.class); - List userList=sys.selectListByPage(new SysUser()); + List userList=sys.list(); System.out.println(userList.get(0).getUsername());; System.out.println("JobDemo4:执行完毕======================="); diff --git a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo5.java b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo5.java index cb0d705..4c3a0c8 100644 --- a/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo5.java +++ b/len-sys/src/main/java/com/len/core/quartz/CustomQuartz/JobDemo5.java @@ -33,7 +33,7 @@ public class JobDemo5 implements Job{ public void run(){ ApplicationContext applicationContext=SpringUtil.getApplicationContext(); SysUserService sys=SpringUtil.getBean(SysUserServiceImpl.class); - List userList=sys.selectListByPage(new SysUser()); + List userList=sys.list(); System.out.println(userList.get(0).getUsername());; System.out.println("JobDemo5:执行完毕======================="); diff --git a/len-sys/src/main/java/com/len/entity/SysDepart.java b/len-sys/src/main/java/com/len/entity/SysDepart.java index f6a8cf4..afd549c 100644 --- a/len-sys/src/main/java/com/len/entity/SysDepart.java +++ b/len-sys/src/main/java/com/len/entity/SysDepart.java @@ -1,14 +1,15 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import javax.persistence.*; - -@Table(name = "sys_depart") +@TableName(value = "sys_depart") @Data public class SysDepart { - @Id - @GeneratedValue(generator = "JDBC") + @TableId(value = "id", type = IdType.UUID) private String id; /** @@ -19,12 +20,10 @@ public class SysDepart { /** * 父级id */ - @Column(name = "parent_id") private String parentId; /** * 部门名称 */ - @Column(name = "depart_name") private String departName; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysJob.java b/len-sys/src/main/java/com/len/entity/SysJob.java index f82f16b..230fd6c 100644 --- a/len-sys/src/main/java/com/len/entity/SysJob.java +++ b/len-sys/src/main/java/com/len/entity/SysJob.java @@ -1,32 +1,29 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.len.base.AbstractEntity; import com.len.validator.group.AddGroup; import com.len.validator.group.UpdateGroup; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import java.util.Date; -@Table(name = "sys_job") +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sys_job") @Data @ToString -@EqualsAndHashCode -public class SysJob { - @Id - @Column(name = "id") - private String id; +public class SysJob extends AbstractEntity { /** * 描述任务 */ @NotEmpty(message = "任务描述不能为空", groups = {AddGroup.class, UpdateGroup.class}) - @Column(name = "job_name") private String jobName; /** @@ -44,24 +41,11 @@ public class SysJob { * 任务执行方法 */ @NotEmpty(message = "执行方法不能未空", groups = {AddGroup.class, UpdateGroup.class}) - @Column(name = "clazz_path") private String clazzPath; /** * 其他描述 */ - @Column(name = "job_desc") private String jobDesc; - @Column(name = "create_by") - private String createBy; - - @Column(name = "create_date") - private Date createDate; - - @Column(name = "update_by") - private String updateBy; - - @Column(name = "update_date") - private Date updateDate; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysLog.java b/len-sys/src/main/java/com/len/entity/SysLog.java index 5f45664..d2df42e 100644 --- a/len-sys/src/main/java/com/len/entity/SysLog.java +++ b/len-sys/src/main/java/com/len/entity/SysLog.java @@ -1,18 +1,17 @@ package com.len.entity; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + import java.util.Date; -@Table(name = "sys_log") +@TableName(value = "sys_log") public class SysLog { - @Id - @Column(name = "id") + @TableId(type = IdType.AUTO) private Integer id; - @Column(name = "user_name") private String userName; private String ip; @@ -21,7 +20,6 @@ public class SysLog { private String text; - @Column(name = "create_time") private Date createTime; private String param; diff --git a/len-sys/src/main/java/com/len/entity/SysMenu.java b/len-sys/src/main/java/com/len/entity/SysMenu.java index 06d2a84..e28691e 100644 --- a/len-sys/src/main/java/com/len/entity/SysMenu.java +++ b/len-sys/src/main/java/com/len/entity/SysMenu.java @@ -1,34 +1,27 @@ package com.len.entity; -import com.len.validator.group.AddGroup; -import com.len.validator.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.len.base.AbstractEntity; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.hibernate.validator.constraints.Length; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; import java.util.ArrayList; import java.util.Date; import java.util.List; -@Table(name = "sys_menu") +@TableName("sys_menu") @Data @ToString @EqualsAndHashCode -public class SysMenu { - @Id - @Column(name = "id") - private String id; +public class SysMenu extends AbstractEntity { + - @NotEmpty(message = "菜单名称不能为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; - @Column(name = "p_id") private String pId; private String url; @@ -36,8 +29,6 @@ public class SysMenu { /** * 排序字段 */ - @Length(min = 1,max = 4, message = "序号长度不对") - @Column(name = "order_num") private Integer orderNum; /** @@ -45,18 +36,6 @@ public class SysMenu { */ private String icon; - @Column(name = "create_by") - private String createBy; - - @Column(name = "create_date") - private Date createDate; - - @Column(name = "update_by") - private String updateBy; - - @Column(name = "update_date") - private Date updateDate; - /** * 权限 */ @@ -65,18 +44,20 @@ public class SysMenu { /** * 1栏目2菜单 */ - @Column(name = "menu_type") private Byte menuType; + @TableField(exist = false) private int num; + @TableField(exist = false) private List roleList; private static final long serialVersionUID = 1L; - private List children=new ArrayList(); + @TableField(exist = false) + private List children = new ArrayList(); - public void addChild(SysMenu sysMenu){ + public void addChild(SysMenu sysMenu) { children.add(sysMenu); } } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysRole.java b/len-sys/src/main/java/com/len/entity/SysRole.java index bcef538..bf5d626 100644 --- a/len-sys/src/main/java/com/len/entity/SysRole.java +++ b/len-sys/src/main/java/com/len/entity/SysRole.java @@ -1,42 +1,27 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.len.base.AbstractEntity; import com.len.validator.group.AddGroup; import com.len.validator.group.UpdateGroup; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import java.util.Date; -@Table(name = "sys_role") +@TableName(value = "sys_role") @Data @ToString @EqualsAndHashCode -public class SysRole { - @Id - @Column(name = "id") - private String id; +public class SysRole extends AbstractEntity { @NotEmpty(message = "角色名称不能为空", groups = {AddGroup.class, UpdateGroup.class}) - @Column(name = "role_name") private String roleName; private String remark; - - @Column(name = "create_by") - private String createBy; - - @Column(name = "create_date") - private Date createDate; - - @Column(name = "update_by") - private String updateBy; - - @Column(name = "update_date") - private Date updateDate; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysRoleMenu.java b/len-sys/src/main/java/com/len/entity/SysRoleMenu.java index ac6cb07..11603d9 100644 --- a/len-sys/src/main/java/com/len/entity/SysRoleMenu.java +++ b/len-sys/src/main/java/com/len/entity/SysRoleMenu.java @@ -1,44 +1,19 @@ package com.len.entity; -import javax.persistence.Column; -import javax.persistence.Id; -import javax.persistence.Table; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; -@Table(name = "sys_role_menu") +@Data +@TableName(value = "sys_role_menu") public class SysRoleMenu { - @Id - @Column(name = "role_id") - private String roleId; - - - @Column(name = "menu_id") - private String menuId; - /** - * @return role_id - */ - public String getRoleId() { - return roleId; - } + @TableId(type = IdType.UUID) + private String id; - /** - * @param roleId - */ - public void setRoleId(String roleId) { - this.roleId = roleId == null ? null : roleId.trim(); - } + private String roleId; - /** - * @return menu_id - */ - public String getMenuId() { - return menuId; - } - /** - * @param menuId - */ - public void setMenuId(String menuId) { - this.menuId = menuId == null ? null : menuId.trim(); - } + private String menuId; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysRoleUser.java b/len-sys/src/main/java/com/len/entity/SysRoleUser.java index 8c2b1e1..af3c2fc 100644 --- a/len-sys/src/main/java/com/len/entity/SysRoleUser.java +++ b/len-sys/src/main/java/com/len/entity/SysRoleUser.java @@ -1,44 +1,19 @@ package com.len.entity; -import javax.persistence.Column; -import javax.persistence.Id; -import javax.persistence.Table; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; -@Table(name = "sys_role_user") +@Data +@TableName(value = "sys_role_user") public class SysRoleUser { - @Id - @Column(name = "user_id") - private String userId; - - - @Column(name = "role_id") - private String roleId; - /** - * @return user_id - */ - public String getUserId() { - return userId; - } + @TableId(type = IdType.UUID) + private String id; - /** - * @param userId - */ - public void setUserId(String userId) { - this.userId = userId == null ? null : userId.trim(); - } + private String userId; - /** - * @return role_id - */ - public String getRoleId() { - return roleId; - } - /** - * @param roleId - */ - public void setRoleId(String roleId) { - this.roleId = roleId == null ? null : roleId.trim(); - } + private String roleId; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysUser.java b/len-sys/src/main/java/com/len/entity/SysUser.java index 2fd9760..77d5670 100644 --- a/len-sys/src/main/java/com/len/entity/SysUser.java +++ b/len-sys/src/main/java/com/len/entity/SysUser.java @@ -1,55 +1,42 @@ package com.len.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.len.base.AbstractEntity; import com.len.validator.group.AddGroup; import com.len.validator.group.UpdateGroup; import lombok.Data; import lombok.ToString; -import javax.persistence.Column; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import java.util.Date; -@Table(name = "sys_user") +@TableName(value = "sys_user") @Data @ToString -public class SysUser { - @Id - @Column(name = "id") - private String id; +public class SysUser extends AbstractEntity { + @NotEmpty(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @TableField private String username; @NotEmpty(message = "密码不能为空", groups = {AddGroup.class, UpdateGroup.class}) + @TableField private String password; - + @TableField private Integer age; - + @TableField private String email; - + @TableField private String photo; - @Column(name = "real_name") private String realName; - @Column(name = "create_by") - private String createBy; - - @Column(name = "update_by") - private String updateBy; - - @Column(name = "create_date") - private Date createDate; - - @Column(name = "update_date") - private Date updateDate; - /** * 0可用1封禁 */ - @Column(name = "del_flag") private Byte delFlag; } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/entity/SysUserDepart.java b/len-sys/src/main/java/com/len/entity/SysUserDepart.java index 989a631..860f8e5 100644 --- a/len-sys/src/main/java/com/len/entity/SysUserDepart.java +++ b/len-sys/src/main/java/com/len/entity/SysUserDepart.java @@ -1,20 +1,21 @@ package com.len.entity; -import javax.persistence.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; -@Table(name = "sys_user_depart") +@TableName(value = "sys_user_depart") public class SysUserDepart { /** * 用户id */ - @Id - @Column(name = "user_id") + @TableId(type = IdType.UUID, value = "user_id") private String userId; /** * 部门id */ - @Column(name = "depart_id") + @TableId(type = IdType.UUID, value = "depart_id") private String departId; /** diff --git a/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java b/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java index a804ad2..4184a23 100644 --- a/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysDepartMapper.java @@ -3,5 +3,5 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysDepart; -public interface SysDepartMapper extends BaseMapper { +public interface SysDepartMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysJobMapper.java b/len-sys/src/main/java/com/len/mapper/SysJobMapper.java index 3bdf987..9c08d09 100644 --- a/len-sys/src/main/java/com/len/mapper/SysJobMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysJobMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysJob; -import tk.mybatis.mapper.common.Mapper; -public interface SysJobMapper extends BaseMapper { +public interface SysJobMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysLogMapper.java b/len-sys/src/main/java/com/len/mapper/SysLogMapper.java index b048902..055766d 100644 --- a/len-sys/src/main/java/com/len/mapper/SysLogMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysLogMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysLog; -import tk.mybatis.mapper.common.Mapper; -public interface SysLogMapper extends BaseMapper { +public interface SysLogMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysMenuMapper.java b/len-sys/src/main/java/com/len/mapper/SysMenuMapper.java index a94acff..4cbb535 100644 --- a/len-sys/src/main/java/com/len/mapper/SysMenuMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysMenuMapper.java @@ -3,17 +3,19 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysMenu; import org.apache.ibatis.annotations.Param; -import tk.mybatis.mapper.common.Mapper; import java.util.List; -public interface SysMenuMapper extends BaseMapper { +public interface SysMenuMapper extends BaseMapper { - /**获取元节点*/ + /** + * 获取元节点 + */ List getMenuNotSuper(); /** * 获取子节点 + * * @return */ List getMenuChildren(String id); @@ -22,6 +24,7 @@ public interface SysMenuMapper extends BaseMapper { /** * 根据用户获取所有菜单 + * * @param id * @return */ diff --git a/len-sys/src/main/java/com/len/mapper/SysRoleMapper.java b/len-sys/src/main/java/com/len/mapper/SysRoleMapper.java index 55b80e5..ae8a099 100644 --- a/len-sys/src/main/java/com/len/mapper/SysRoleMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysRoleMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysRole; -import tk.mybatis.mapper.common.Mapper; -public interface SysRoleMapper extends BaseMapper { +public interface SysRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysRoleMenuMapper.java b/len-sys/src/main/java/com/len/mapper/SysRoleMenuMapper.java index fb6b247..016cfba 100644 --- a/len-sys/src/main/java/com/len/mapper/SysRoleMenuMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysRoleMenuMapper.java @@ -5,7 +5,7 @@ import com.len.entity.SysRoleMenu; import java.util.List; -public interface SysRoleMenuMapper extends BaseMapper { +public interface SysRoleMenuMapper extends BaseMapper { List selectByCondition(SysRoleMenu sysRoleMenu); int selectCountByCondition(SysRoleMenu sysRoleMenu); diff --git a/len-sys/src/main/java/com/len/mapper/SysRoleUserMapper.java b/len-sys/src/main/java/com/len/mapper/SysRoleUserMapper.java index fdd27ec..891bf4e 100644 --- a/len-sys/src/main/java/com/len/mapper/SysRoleUserMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysRoleUserMapper.java @@ -2,11 +2,10 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysRoleUser; -import tk.mybatis.mapper.common.Mapper; import java.util.List; -public interface SysRoleUserMapper extends BaseMapper { +public interface SysRoleUserMapper extends BaseMapper { List selectByCondition(SysRoleUser sysRoleUser); diff --git a/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java b/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java index e5a6bd2..a2c0f01 100644 --- a/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysUserDepartMapper.java @@ -2,7 +2,6 @@ package com.len.mapper; import com.len.base.BaseMapper; import com.len.entity.SysUserDepart; -import tk.mybatis.mapper.common.Mapper; -public interface SysUserDepartMapper extends BaseMapper { +public interface SysUserDepartMapper extends BaseMapper { } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/mapper/SysUserMapper.java b/len-sys/src/main/java/com/len/mapper/SysUserMapper.java index fd0c24b..bc8c98f 100644 --- a/len-sys/src/main/java/com/len/mapper/SysUserMapper.java +++ b/len-sys/src/main/java/com/len/mapper/SysUserMapper.java @@ -1,14 +1,12 @@ package com.len.mapper; import com.len.entity.SysUser; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import tk.mybatis.mapper.common.BaseMapper; -import tk.mybatis.mapper.common.Mapper; import java.util.List; -import java.util.Map; - -public interface SysUserMapper extends com.len.base.BaseMapper { +@Mapper +public interface SysUserMapper extends com.len.base.BaseMapper { SysUser login(@Param("username") String username); @@ -22,10 +20,11 @@ public interface SysUserMapper extends com.len.base.BaseMapper { /** * 更新密码 + * * @param user * @return */ int rePass(SysUser user); - List getUserByRoleId(@Param("roleId")String roleId); + List getUserByRoleId(@Param("roleId") String roleId); } \ No newline at end of file diff --git a/len-sys/src/main/java/com/len/service/MenuService.java b/len-sys/src/main/java/com/len/service/MenuService.java index 6ab3610..593a658 100644 --- a/len-sys/src/main/java/com/len/service/MenuService.java +++ b/len-sys/src/main/java/com/len/service/MenuService.java @@ -16,10 +16,6 @@ public interface MenuService extends BaseService { List getMenuNotSuper(); - @Override - int insert(SysMenu menu); - - List getMenuChildren(String id); public JSONArray getMenuJsonList(); diff --git a/len-sys/src/main/java/com/len/service/RoleService.java b/len-sys/src/main/java/com/len/service/RoleService.java index cf0fd22..e6416b6 100644 --- a/len-sys/src/main/java/com/len/service/RoleService.java +++ b/len-sys/src/main/java/com/len/service/RoleService.java @@ -4,40 +4,18 @@ import com.len.base.BaseService; import com.len.entity.SysRole; import com.len.util.LenResponse; -import java.util.List; - /** * @author zhuxiaomeng * @date 2017/12/19. * @email 154040976@qq.com */ -public interface RoleService extends BaseService { - - - @Override - int deleteByPrimaryKey(String id); - - @Override - int insert(SysRole record); - - @Override - int insertSelective(SysRole record); - - - SysRole selectByPrimaryKey(String id); - - @Override - int updateByPrimaryKeySelective(SysRole record); +public interface RoleService extends BaseService { - @Override - int updateByPrimaryKey(SysRole record); - @Override - List selectListByPage(SysRole sysRole); - public LenResponse addRole(SysRole sysRole, String[] menus); + LenResponse addRole(SysRole sysRole, String[] menus); - public LenResponse updateUser(SysRole role, String[] menus); + LenResponse updateUser(SysRole role, String[] menus); - public LenResponse del(String id); + LenResponse del(String id); } diff --git a/len-sys/src/main/java/com/len/service/RoleUserService.java b/len-sys/src/main/java/com/len/service/RoleUserService.java index 1fd2cc8..7d624ec 100644 --- a/len-sys/src/main/java/com/len/service/RoleUserService.java +++ b/len-sys/src/main/java/com/len/service/RoleUserService.java @@ -10,13 +10,4 @@ import java.util.List; * @email 154040976@qq.com */ public interface RoleUserService extends BaseService{ - - int deleteByPrimaryKey(SysRoleUser sysRoleUser); - - @Override - int insert(SysRoleUser sysRoleUser); - - int selectCountByCondition(SysRoleUser sysRoleUser); - - List selectByCondition(SysRoleUser sysRoleUser); } diff --git a/len-sys/src/main/java/com/len/service/SysUserService.java b/len-sys/src/main/java/com/len/service/SysUserService.java index 4923a5d..2a3e2a3 100644 --- a/len-sys/src/main/java/com/len/service/SysUserService.java +++ b/len-sys/src/main/java/com/len/service/SysUserService.java @@ -6,6 +6,7 @@ import com.len.entity.SysRoleUser; import com.len.entity.SysUser; import com.len.util.Checkbox; import com.len.util.LenResponse; + import java.util.List; /** @@ -13,59 +14,45 @@ import java.util.List; * @date 2017/12/4. * @email 154040976@qq.com */ -public interface SysUserService extends BaseService { - - SysUser login(String username); - - - SysUser selectByPrimaryKey(String id); - - /** - * 分页查询 - * @param - * @return - */ - @Override - List selectListByPage(SysUser sysUser); - - int count(); - - /** - * 新增 - * @param user - * @return - */ - int add(SysUser user); +public interface SysUserService extends BaseService { - /** - * 删除 - * @param id - * @return - */ - LenResponse delById(String id, boolean flag); + SysUser login(String username); - int checkUser(String username); + /** + * 新增 + * + * @param user + * @return + */ + int add(SysUser user); + /** + * 删除 + * + * @param id + * @return + */ + LenResponse delById(String id, boolean flag); + int checkUser(String username); - @Override - int updateByPrimaryKey(SysUser sysUser); - List selectByCondition(SysRoleUser sysRoleUser); + List selectByCondition(SysRoleUser sysRoleUser); - public List getUserRoleByJson(String id); + List getUserRoleByJson(String id); - /** - * 更新密码 - * @param user - * @return - */ - int rePass(SysUser user); + /** + * 更新密码 + * + * @param user + * @return + */ + int rePass(SysUser user); - List getUserByRoleId(String roleId); + List getUserByRoleId(String roleId); - public void setMenuAndRoles(String username); + void setMenuAndRoles(String username); - public void updateCurrent(SysUser user); + void updateCurrent(SysUser user); } diff --git a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java index a4b3979..71ceb85 100644 --- a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java @@ -1,6 +1,5 @@ package com.len.service.impl; -import com.len.base.BaseMapper; import com.len.base.impl.BaseServiceImpl; import com.len.core.quartz.JobTask; import com.len.entity.SysJob; @@ -29,20 +28,16 @@ public class JobServiceImpl extends BaseServiceImpl implements J @Autowired JobTask jobTask; - @Autowired - JobService jobService; + /* @Autowired + JobService jobService;*/ - @Override - public BaseMapper getMappser() { - return jobMapper; - } @Override public boolean updateJob(SysJob job) { try { - SysJob oldJob = selectByPrimaryKey(job.getId()); + SysJob oldJob = getById(job.getId()); BeanUtil.copyNotNullBean(job, oldJob); - updateByPrimaryKey(oldJob); + updateById(oldJob); return true; } catch (MyException e) { log.error(e.getMessage()); @@ -59,7 +54,7 @@ public class JobServiceImpl extends BaseServiceImpl implements J return j; } try { - SysJob job = selectByPrimaryKey(id); + SysJob job = getById(id); boolean flag = jobTask.checkJob(job); if ((flag && !job.getStatus()) || !flag && job.getStatus()) { j.setMsg("您任务表状态和web任务状态不一致,无法删除"); @@ -69,7 +64,7 @@ public class JobServiceImpl extends BaseServiceImpl implements J j.setMsg("该任务处于启动中,无法删除"); return j; } - jobService.deleteByPrimaryKey(id); + removeById(id); j.setFlag(true); j.setMsg("任务删除成功"); } catch (MyException e) { @@ -82,10 +77,10 @@ public class JobServiceImpl extends BaseServiceImpl implements J @Override public boolean startJob(String id) { try { - SysJob job = jobService.selectByPrimaryKey(id); + SysJob job = getById(id); jobTask.startJob(job); job.setStatus(true); - jobService.updateByPrimaryKey(job); + updateById(job); return true; } catch (MyException e) { log.error(e.getMessage()); @@ -97,10 +92,10 @@ public class JobServiceImpl extends BaseServiceImpl implements J @Override public boolean stopJob(String id) { try { - SysJob job = jobService.selectByPrimaryKey(id); + SysJob job = getById(id); jobTask.remove(job); job.setStatus(false); - jobService.updateByPrimaryKey(job); + updateById(job); return true; } catch (MyException e) { e.printStackTrace(); diff --git a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java index da7e5d9..b4adb6a 100644 --- a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java @@ -1,7 +1,7 @@ package com.len.service.impl; import com.alibaba.fastjson.JSONArray; -import com.len.base.BaseMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.base.impl.BaseServiceImpl; import com.len.entity.SysMenu; import com.len.entity.SysRoleMenu; @@ -37,21 +37,12 @@ public class MenuServiceImpl extends BaseServiceImpl implements @Autowired private RoleMenuService roleMenuService; - @Override - public BaseMapper getMappser() { - return menuDao; - } @Override public List getMenuNotSuper() { return menuDao.getMenuNotSuper(); } - @Override - public int insert(SysMenu menu) { - return menuDao.insert(menu); - } - @Override public List getMenuChildren(String id) { @@ -73,7 +64,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements @Override public JSONArray getMenuJsonList() { - List sysMenus = selectAll(); + List sysMenus = list(); List supers = sysMenus.stream().filter(sysMenu -> StringUtils.isEmpty(sysMenu.getPId())) .collect(Collectors.toList()); @@ -123,7 +114,8 @@ public class MenuServiceImpl extends BaseServiceImpl implements } SysRoleMenu sysRoleMenu = new SysRoleMenu(); sysRoleMenu.setMenuId(id); - int count = roleMenuService.selectCount(sysRoleMenu); + QueryWrapper sysRoleMenuQueryWrapper = new QueryWrapper<>(sysRoleMenu); + int count = roleMenuService.count(sysRoleMenuQueryWrapper); //存在角色绑定不能删除 if (count > 0) { json.setMsg("本菜单存在绑定角色,请先解除绑定!"); @@ -132,11 +124,12 @@ public class MenuServiceImpl extends BaseServiceImpl implements //存在下级菜单 不能解除 SysMenu sysMenu = new SysMenu(); sysMenu.setPId(id); - if (selectCount(sysMenu) > 0) { + QueryWrapper sysRoleMenuQueryWrapperTwo = new QueryWrapper<>(sysMenu); + if (menuDao.selectCount(sysRoleMenuQueryWrapperTwo) > 0) { json.setMsg("存在子菜单,请先删除子菜单!"); return json; } - boolean isDel = deleteByPrimaryKey(id) > 0; + boolean isDel = removeById(id); if (isDel) { json.setMsg("删除成功"); json.setFlag(true); @@ -168,7 +161,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements @Override public JSONArray getTreeUtil(String roleId) { TreeUtil treeUtil = null; - List sysMenus = selectAll(); + List sysMenus = list(); List supers = sysMenus.stream().filter(sysMenu -> StringUtils.isEmpty(sysMenu.getPId())) .collect(Collectors.toList()); @@ -204,8 +197,9 @@ public class MenuServiceImpl extends BaseServiceImpl implements sysRoleMenu.setMenuId(sysMenu.getId()); sysRoleMenu.setRoleId(roleId); int count = roleMenuMapper.selectCountByCondition(sysRoleMenu); - if (count > 0) + if (count > 0) { treeUtil.setChecked(true); + } } for (SysMenu menu : childSysMenu) { TreeUtil m = getChildByTree(menu, sysMenus, layer, menu.getId(), roleId); diff --git a/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java index 4070d8e..f4cd960 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java @@ -19,10 +19,6 @@ public class RoleMenuServiceImpl extends BaseServiceImpl imp RoleMenuService { @Autowired private SysRoleMenuMapper roleMenuMapper; - @Override - public BaseMapper getMappser() { - return roleMenuMapper; - } @Override public List selectByCondition(SysRoleMenu sysRoleMenu) { @@ -36,6 +32,6 @@ public class RoleMenuServiceImpl extends BaseServiceImpl imp @Override public int deleteByPrimaryKey(SysRoleMenu sysRoleMenu) { - return roleMenuMapper.deleteByPrimaryKey(sysRoleMenu); + return roleMenuMapper.deleteById(sysRoleMenu.getId()); } } diff --git a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java index fdbd22a..2d0bd84 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java @@ -1,6 +1,6 @@ package com.len.service.impl; -import com.len.base.BaseMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.base.impl.BaseServiceImpl; import com.len.entity.SysRole; import com.len.entity.SysRoleMenu; @@ -12,6 +12,7 @@ import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.util.BeanUtil; import com.len.util.LenResponse; +import com.len.util.UuidUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -34,55 +35,27 @@ public class RoleServiceImpl extends BaseServiceImpl implements @Autowired private RoleUserService roleUserService; - @Override - public BaseMapper getMappser() { - return roleMapper; - } - - @Override - public int deleteByPrimaryKey(String id) { - return roleMapper.deleteByPrimaryKey(id); - } - @Override + /*@Override public int insert(SysRole record) { record = super.addValue(record, true); return roleMapper.insert(record); - } - - @Override - public SysRole selectByPrimaryKey(String id) { - return roleMapper.selectByPrimaryKey(id); - } - - @Override - public int updateByPrimaryKeySelective(SysRole record) { - return roleMapper.updateByPrimaryKeySelective(record); - } - - @Override - public int updateByPrimaryKey(SysRole record) { - return roleMapper.updateByPrimaryKey(record); - } - - @Override - public List selectListByPage(SysRole sysRole) { - return roleMapper.selectListByPage(sysRole); - } + }*/ @Override public LenResponse addRole(SysRole sysRole, String[] menus) { LenResponse j = new LenResponse(); try { - insertSelective(sysRole); + roleMapper.insert(sysRole); //操作role-menu data - SysRoleMenu sysRoleMenu = new SysRoleMenu(); - sysRoleMenu.setRoleId(sysRole.getId()); if (menus != null) { for (String menu : menus) { + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setId(UuidUtil.getUuid()); + sysRoleMenu.setRoleId(sysRole.getId()); sysRoleMenu.setMenuId(menu); - roleMenuService.insert(sysRoleMenu); + roleMenuService.save(sysRoleMenu); } } j.setMsg("保存成功"); @@ -99,9 +72,9 @@ public class RoleServiceImpl extends BaseServiceImpl implements LenResponse jsonUtil = new LenResponse(); jsonUtil.setFlag(false); try { - SysRole oldRole = selectByPrimaryKey(role.getId()); + SysRole oldRole = roleMapper.selectById(role.getId()); BeanUtil.copyNotNullBean(role, oldRole); - updateByPrimaryKeySelective(oldRole); + roleMapper.updateById(oldRole); SysRoleMenu sysRoleMenu = new SysRoleMenu(); sysRoleMenu.setRoleId(role.getId()); @@ -109,11 +82,13 @@ public class RoleServiceImpl extends BaseServiceImpl implements for (SysRoleMenu sysRoleMenu1 : menuList) { roleMenuService.deleteByPrimaryKey(sysRoleMenu1); } - if (menus != null) + if (menus != null) { for (String menu : menus) { + sysRoleMenu.setId(UuidUtil.getUuid()); sysRoleMenu.setMenuId(menu); - roleMenuService.insert(sysRoleMenu); + roleMenuService.save(sysRoleMenu); } + } jsonUtil.setFlag(true); jsonUtil.setMsg("修改成功"); } catch (MyException e) { @@ -129,11 +104,12 @@ public class RoleServiceImpl extends BaseServiceImpl implements sysRoleUser.setRoleId(id); LenResponse j = new LenResponse(); try { - int count = roleUserService.selectCountByCondition(sysRoleUser); + QueryWrapper wrapper = new QueryWrapper<>(sysRoleUser); + int count = roleUserService.count(wrapper); if (count > 0) { return LenResponse.error("已分配给用户,删除失败"); } - deleteByPrimaryKey(id); + roleMapper.deleteById(id); j.setMsg("删除成功"); } catch (MyException e) { j.setMsg("删除失败"); diff --git a/len-sys/src/main/java/com/len/service/impl/RoleUserServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleUserServiceImpl.java index c774865..747f240 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleUserServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleUserServiceImpl.java @@ -17,27 +17,4 @@ import org.springframework.stereotype.Service; @Service public class RoleUserServiceImpl extends BaseServiceImpl implements RoleUserService { - - @Autowired - private SysRoleUserMapper sysRoleUserMapper; - - @Override - public BaseMapper getMappser() { - return sysRoleUserMapper; - } - - @Override - public int deleteByPrimaryKey(SysRoleUser sysRoleUser) { - return sysRoleUserMapper.deleteByPrimaryKey(sysRoleUser); - } - - @Override - public int selectCountByCondition(SysRoleUser sysRoleUser) { - return sysRoleUserMapper.selectCountByCondition(sysRoleUser); - } - - @Override - public List selectByCondition(SysRoleUser sysRoleUser) { - return sysRoleUserMapper.selectByCondition(sysRoleUser); - } } diff --git a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java index ef73070..d81857c 100644 --- a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java @@ -1,6 +1,7 @@ package com.len.service.impl; import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.len.base.BaseMapper; import com.len.base.CurrentMenu; import com.len.base.CurrentRole; @@ -58,66 +59,20 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme private static final String ADMIN = "admin"; - @Override - public BaseMapper getMappser() { - return sysUserMapper; - } - - +// +// String pwd = Md5Util.getMD5(record.getPassword().trim(), record.getUsername().trim()); +// record.setPassword(pwd); @Override public SysUser login(String username) { return sysUserMapper.login(username); } - @Override - public int deleteByPrimaryKey(String id) { - return sysUserMapper.deleteByPrimaryKey(id); - } - - @Override - public int insert(SysUser record) { - return sysUserMapper.insert(record); - } - - @Override - public int insertSelective(SysUser record) { - - String pwd = Md5Util.getMD5(record.getPassword().trim(), record.getUsername().trim()); - record.setPassword(pwd); - return super.insertSelective(record); - } - - @Override - public SysUser selectByPrimaryKey(String id) { - return sysUserMapper.selectByPrimaryKey(id); - } - - @Override - public int updateByPrimaryKeySelective(SysUser record) { - return super.updateByPrimaryKeySelective(record); - } - - @Override - public int updateByPrimaryKey(SysUser record) { - return sysUserMapper.updateByPrimaryKey(record); - } - @Override public List selectByCondition(SysRoleUser sysRoleUser) { return sysRoleUserMapper.selectByCondition(sysRoleUser); } - /** - * 分页查询 - * - * @param - * @return - */ - @Override - public List selectListByPage(SysUser sysUser) { - return sysUserMapper.selectListByPage(sysUser); - } @Override public int count() { @@ -139,20 +94,21 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme } LenResponse j = new LenResponse(); try { - SysUser sysUser = selectByPrimaryKey(id); + SysUser sysUser = sysUserMapper.selectById(id); if (ADMIN.equals(sysUser.getUsername())) { return LenResponse.error("超管无法删除"); } SysRoleUser roleUser = new SysRoleUser(); roleUser.setUserId(id); - int count = roleUserService.selectCountByCondition(roleUser); + QueryWrapper wrapper=new QueryWrapper<>(roleUser); + int count = roleUserService.count(wrapper); if (count > 0) { return LenResponse.error("账户已经绑定角色,无法删除"); } if (flag) { //逻辑 sysUser.setDelFlag(Byte.parseByte("1")); - updateByPrimaryKeySelective(sysUser); + sysUserMapper.updateById(sysUser); } else { //物理 sysUserMapper.delById(id); @@ -174,7 +130,7 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme @Override public List getUserRoleByJson(String id) { - List roleList = roleService.selectListByPage(new SysRole()); + List roleList = roleService.list(); SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(id); List kList = selectByCondition(sysRoleUser); @@ -212,7 +168,8 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme public void setMenuAndRoles(String username) { SysUser s = new SysUser(); s.setUsername(username); - s = this.selectOne(s); + QueryWrapper userQueryWrapper=new QueryWrapper<>(s); + s = sysUserMapper.selectOne(userQueryWrapper); CurrentUser currentUser = new CurrentUser(s.getId(), s.getUsername(), s.getAge(), s.getEmail(), s.getPhoto(), s.getRealName()); Subject subject = Principal.getSubject(); /*角色权限封装进去*/ diff --git a/len-sys/src/main/resources/ftl/main/index.html b/len-sys/src/main/resources/ftl/main/index.html new file mode 100644 index 0000000..23d4411 --- /dev/null +++ b/len-sys/src/main/resources/ftl/main/index.html @@ -0,0 +1,268 @@ + + + + + 仪表盘 + + + + +
        +
        +
        + 仪表盘 +
        +
        +
          +
        • +
          用户数量
          +
          +
          +
        • +
        • +
          待办任务
          +
          +

          10

          +
          +
        • +
        • +
          系统日志
          +
          +

          2586

          +
          +
        • +
        • +
          定时任务
          +
          +

          3

          +
          +
        • +
        +
        +
        +
        +
        +
          +
        • +
          图表
          +
          +
          +
        • +
        • +
          图表
          +
          +
          +
        • +
        • +
          图表
          +
          +
          +
        • +
        +
        +
        +
        + + + + \ No newline at end of file diff --git a/len-sys/src/main/resources/ftl/system/base/header.ftl b/len-sys/src/main/resources/ftl/system/base/header.ftl index aa6934b..b2b30b3 100644 --- a/len-sys/src/main/resources/ftl/system/base/header.ftl +++ b/len-sys/src/main/resources/ftl/system/base/header.ftl @@ -3,4 +3,39 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/len-sys/src/main/resources/ftl/system/job/jobList.ftl b/len-sys/src/main/resources/ftl/system/job/jobList.ftl index 05feda9..3da9af2 100644 --- a/len-sys/src/main/resources/ftl/system/job/jobList.ftl +++ b/len-sys/src/main/resources/ftl/system/job/jobList.ftl @@ -112,7 +112,7 @@ } } layui.use('table', function () { - var table = layui.table; + table = layui.table; //方法级渲染 table.render({ id: 'jobList', diff --git a/len-sys/src/main/resources/ftl/system/person/me.ftl b/len-sys/src/main/resources/ftl/system/person/me.ftl index 58751e2..a699924 100644 --- a/len-sys/src/main/resources/ftl/system/person/me.ftl +++ b/len-sys/src/main/resources/ftl/system/person/me.ftl @@ -1,4 +1,3 @@ -!DOCTYPE html> diff --git a/len-sys/src/main/resources/ftl/system/role/roleList.ftl b/len-sys/src/main/resources/ftl/system/role/roleList.ftl index aa54c51..03d3b1b 100644 --- a/len-sys/src/main/resources/ftl/system/role/roleList.ftl +++ b/len-sys/src/main/resources/ftl/system/role/roleList.ftl @@ -61,49 +61,11 @@ + + + + -- Gitee From d58577eab455d51b8dc860899737d450f069396f Mon Sep 17 00:00:00 2001 From: zhuxiaomeng Date: Fri, 27 Mar 2020 19:10:16 +0800 Subject: [PATCH 18/39] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=9B=BE=E7=89=87=E6=8A=A5=E9=94=99=EF=BC=8C=E6=8D=A2?= =?UTF-8?q?=E6=88=90mybatisplus=20=E7=94=A8=E6=88=B7=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E6=9C=AA=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/activiti/rest/ActivitiService.java | 14 +++++++++----- .../java/com/len/controller/UserController.java | 1 + .../core/shiro/RetryLimitCredentialsMatcher.java | 1 - 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java index e654594..f18ea1a 100644 --- a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java +++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java @@ -126,17 +126,21 @@ public class ActivitiService { List historicIdentityLinksForTask = historyService.getHistoricIdentityLinksForTask(s.getId()); List groupName = new ArrayList<>(); historicIdentityLinksForTask.forEach(hist -> { - List groupList = identityService.createGroupQuery().groupId(hist.getGroupId()).list(); - if (groupList.size() > 0) { - List groupNames = groupList.stream().map(Group::getName).collect(Collectors.toList()); - groupName.addAll(groupNames); + if(!StringUtils.isEmpty(hist.getGroupId())){ + List groupList = identityService.createGroupQuery().groupId(hist.getGroupId()).list(); + if (groupList.size() > 0) { + List groupNames = groupList.stream().map(Group::getName).collect(Collectors.toList()); + groupName.addAll(groupNames); + } } }); activitiProcess.setGroupNames(groupName); if (!StringUtils.isEmpty(assignee)) { activitiProcess.setUserId(assignee); User user = identityService.createUserQuery().userId(assignee).singleResult(); - activitiProcess.setUserName(user.getFirstName()); + if(user!=null){ + activitiProcess.setUserName(user.getFirstName()); + } activitiProcess.setSid(s.getTaskDefinitionKey()); } diff --git a/len-sys/src/main/java/com/len/controller/UserController.java b/len-sys/src/main/java/com/len/controller/UserController.java index eb5b6b7..752814d 100644 --- a/len-sys/src/main/java/com/len/controller/UserController.java +++ b/len-sys/src/main/java/com/len/controller/UserController.java @@ -115,6 +115,7 @@ public class UserController extends BaseController { } LenResponse j = new LenResponse(); try { + user.setPassword(Md5Util.getMD5(user.getPassword(),user.getUsername())); userService.save(user); SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(user.getId()); diff --git a/len-sys/src/main/java/com/len/core/shiro/RetryLimitCredentialsMatcher.java b/len-sys/src/main/java/com/len/core/shiro/RetryLimitCredentialsMatcher.java index 8401786..e35f5cb 100644 --- a/len-sys/src/main/java/com/len/core/shiro/RetryLimitCredentialsMatcher.java +++ b/len-sys/src/main/java/com/len/core/shiro/RetryLimitCredentialsMatcher.java @@ -53,7 +53,6 @@ public class RetryLimitCredentialsMatcher extends HashedCredentialsMatcher { ? new AtomicInteger(0) : loginRetryCache.get(username); log.info("retryCount:{}, username:{}",retryCount,username); if (retryCount.incrementAndGet() > this.maxRetryCount) { - log.warn("username: {} tried to login more than {} times in perid", username,this.maxRetryCount); throw new ExcessiveAttemptsException(StrUtil.format("username: {} tried to login more than {} times in perid", username,this.maxRetryCount)); } boolean matches = super.doCredentialsMatch(token, info); -- Gitee From 6dca8e8d3cd449b1ae44ede3e0a92fb001b2c3ef Mon Sep 17 00:00:00 2001 From: zhuxiaomeng Date: Fri, 27 Mar 2020 20:53:47 +0800 Subject: [PATCH 19/39] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- len-activiti/src/main/resources/ftl/act/activiti/shinePics.html | 1 - 1 file changed, 1 deletion(-) diff --git a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html index be31ca3..e198750 100644 --- a/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html +++ b/len-activiti/src/main/resources/ftl/act/activiti/shinePics.html @@ -92,7 +92,6 @@ } msg+=`
        审批组:`; if(t.groupNames){ - t.groupNames.push('aaa'); t.groupNames.forEach(function(v,index){ msg+=v; msg+=(index===t.groupNames.length-1?'':'/'); -- Gitee From a24c16d78adae830358455f8773c907c95d93d87 Mon Sep 17 00:00:00 2001 From: zhuxiaomeng Date: Tue, 7 Apr 2020 11:20:42 +0800 Subject: [PATCH 20/39] =?UTF-8?q?swagger=20description=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- len-core/src/main/java/com/len/util/Md5Util.java | 2 +- len-sys/src/main/java/com/len/controller/ErrorController.java | 2 +- len-sys/src/main/java/com/len/controller/JobController.java | 2 +- len-sys/src/main/java/com/len/controller/LogController.java | 2 +- len-sys/src/main/java/com/len/controller/LoginController.java | 2 +- len-sys/src/main/java/com/len/controller/MenuController.java | 2 +- len-sys/src/main/java/com/len/controller/PersonController.java | 2 +- len-sys/src/main/java/com/len/controller/RoleController.java | 2 +- len-sys/src/main/java/com/len/controller/UserController.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/len-core/src/main/java/com/len/util/Md5Util.java b/len-core/src/main/java/com/len/util/Md5Util.java index 3a1a459..840e722 100644 --- a/len-core/src/main/java/com/len/util/Md5Util.java +++ b/len-core/src/main/java/com/len/util/Md5Util.java @@ -18,7 +18,7 @@ public class Md5Util { * @param args */ public static void main(String[] args) { - String str= getMD5("123456","tom"); + String str= getMD5("111111","manager"); System.out.println(str); } } diff --git a/len-sys/src/main/java/com/len/controller/ErrorController.java b/len-sys/src/main/java/com/len/controller/ErrorController.java index 60859c0..6445bd9 100644 --- a/len-sys/src/main/java/com/len/controller/ErrorController.java +++ b/len-sys/src/main/java/com/len/controller/ErrorController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; */ @Controller @RequestMapping(value = "/error") -@Api(value = "异常", description = "异常业务类") +@Api(value = "异常", tags = "异常业务类") public class ErrorController { @GetMapping(value = "404") diff --git a/len-sys/src/main/java/com/len/controller/JobController.java b/len-sys/src/main/java/com/len/controller/JobController.java index fd2127d..47437a7 100644 --- a/len-sys/src/main/java/com/len/controller/JobController.java +++ b/len-sys/src/main/java/com/len/controller/JobController.java @@ -30,7 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @Controller @RequestMapping("/job") -@Api(value = "定时任务",description="定时任务") +@Api(value = "定时任务",tags="定时任务") public class JobController extends BaseController { @Autowired diff --git a/len-sys/src/main/java/com/len/controller/LogController.java b/len-sys/src/main/java/com/len/controller/LogController.java index 1f2154a..9f8d57d 100644 --- a/len-sys/src/main/java/com/len/controller/LogController.java +++ b/len-sys/src/main/java/com/len/controller/LogController.java @@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value = "/log") @Slf4j -@Api(value = "日志管理",description="操作日志记录") +@Api(value = "日志管理",tags="操作日志记录") public class LogController extends BaseController { @Autowired private SysLogMapper logMapper; diff --git a/len-sys/src/main/java/com/len/controller/LoginController.java b/len-sys/src/main/java/com/len/controller/LoginController.java index 226ba40..3c55428 100644 --- a/len-sys/src/main/java/com/len/controller/LoginController.java +++ b/len-sys/src/main/java/com/len/controller/LoginController.java @@ -32,7 +32,7 @@ import javax.servlet.http.HttpSession; */ @Controller @Slf4j -@Api(value = "登录业务",description="登录校验处理") +@Api(value = "登录业务",tags="登录校验处理") public class LoginController { @Autowired diff --git a/len-sys/src/main/java/com/len/controller/MenuController.java b/len-sys/src/main/java/com/len/controller/MenuController.java index 32f2011..267d607 100644 --- a/len-sys/src/main/java/com/len/controller/MenuController.java +++ b/len-sys/src/main/java/com/len/controller/MenuController.java @@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @RequestMapping("/menu") @Controller -@Api(value = "菜单管理",description="菜单业务处理") +@Api(value = "菜单管理",tags="菜单业务处理") public class MenuController extends BaseController { @Autowired diff --git a/len-sys/src/main/java/com/len/controller/PersonController.java b/len-sys/src/main/java/com/len/controller/PersonController.java index eae6c6d..e26e1e7 100644 --- a/len-sys/src/main/java/com/len/controller/PersonController.java +++ b/len-sys/src/main/java/com/len/controller/PersonController.java @@ -27,7 +27,7 @@ import java.util.List; */ @Controller @RequestMapping("/person") -@Api(value = "个人业务",description="个人业务处理") +@Api(value = "个人业务",tags="个人业务处理") public class PersonController { @Autowired diff --git a/len-sys/src/main/java/com/len/controller/RoleController.java b/len-sys/src/main/java/com/len/controller/RoleController.java index 2fb6b99..e045c8d 100644 --- a/len-sys/src/main/java/com/len/controller/RoleController.java +++ b/len-sys/src/main/java/com/len/controller/RoleController.java @@ -30,7 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @Controller @RequestMapping(value = "/role") -@Api(value = "用户角色管理",description="角色业务处理") +@Api(value = "用户角色管理",tags="角色业务处理") public class RoleController extends BaseController { @Autowired diff --git a/len-sys/src/main/java/com/len/controller/UserController.java b/len-sys/src/main/java/com/len/controller/UserController.java index 752814d..2bdf489 100644 --- a/len-sys/src/main/java/com/len/controller/UserController.java +++ b/len-sys/src/main/java/com/len/controller/UserController.java @@ -38,7 +38,7 @@ import java.util.List; //@Api(value="user") @Controller @RequestMapping(value = "/user") -@Api(value = "用户管理",description="用户管理业务") +@Api(value = "用户管理",tags="用户管理业务") public class UserController extends BaseController { //private static final Logger -- Gitee From 764c798abb4b33901e6d5f6e3796129244d9523d Mon Sep 17 00:00:00 2001 From: zhuxiaomeng Date: Tue, 7 Apr 2020 19:18:03 +0800 Subject: [PATCH 21/39] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E8=B0=83=E6=95=B4=EF=BC=8C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../len/controller/BlogAdminController.java | 2 +- .../java/com/len/base/BaseController.java | 43 +++++- .../main/java/com/len/base/BaseService.java | 2 +- .../len/base/impl/AbstractServiceImpl.java | 6 +- .../com/len/controller/JobController.java | 48 ++---- .../com/len/controller/LogController.java | 21 +-- .../com/len/controller/LoginController.java | 8 +- .../com/len/controller/MenuController.java | 27 +--- .../com/len/controller/PersonController.java | 22 +-- .../com/len/controller/RoleController.java | 16 +- .../com/len/controller/UserController.java | 137 +++++------------- .../java/com/len/service/SysUserService.java | 15 +- .../com/len/service/impl/JobServiceImpl.java | 61 +++----- .../com/len/service/impl/MenuServiceImpl.java | 15 +- .../len/service/impl/RoleMenuServiceImpl.java | 1 + .../com/len/service/impl/RoleServiceImpl.java | 88 ++++------- .../len/service/impl/SysUserServiceImpl.java | 113 +++++++++------ .../resources/ftl/system/user/re-pass.ftl | 17 +-- .../src/main/java/com/len/config/RConfig.java | 62 ++++++++ .../main/java/com/len/config/ShiroConfig.java | 103 ++++++++----- .../com/len/config/ShiroSessionManager.java | 34 +++++ .../com/len/config/TransactionalConfig.java | 69 +++++---- .../main/resources/application-mysql-dev.yml | 47 ++---- pom.xml | 23 ++- 24 files changed, 513 insertions(+), 467 deletions(-) create mode 100644 len-web/src/main/java/com/len/config/RConfig.java create mode 100644 len-web/src/main/java/com/len/config/ShiroSessionManager.java diff --git a/len-blog/src/main/java/com/len/controller/BlogAdminController.java b/len-blog/src/main/java/com/len/controller/BlogAdminController.java index 367f39a..208d06e 100644 --- a/len-blog/src/main/java/com/len/controller/BlogAdminController.java +++ b/len-blog/src/main/java/com/len/controller/BlogAdminController.java @@ -79,7 +79,7 @@ public class BlogAdminController { int serverPort = request.getServerPort(); int i = requestURL.indexOf(String.valueOf(serverPort)); String url = requestURL.substring(0, i); - json.setData(url + String.valueOf(serverPort) + "/img/" + path); + json.setData(url + serverPort + "/img/" + path); json.setFlag(true); return json; } diff --git a/len-core/src/main/java/com/len/base/BaseController.java b/len-core/src/main/java/com/len/base/BaseController.java index cef319f..8b57110 100644 --- a/len-core/src/main/java/com/len/base/BaseController.java +++ b/len-core/src/main/java/com/len/base/BaseController.java @@ -2,6 +2,7 @@ package com.len.base; import com.alibaba.fastjson.JSON; import com.google.common.collect.Maps; +import com.len.util.LenResponse; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.InitBinder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; @@ -29,12 +31,12 @@ public abstract class BaseController { @InitBinder protected void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor( - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)); + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)); binder.registerCustomEditor(Date.class, new CustomDateEditor( - new SimpleDateFormat("yyyy-MM-dd"), true)); + new SimpleDateFormat("yyyy-MM-dd"), true)); } - @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class}) + @ExceptionHandler( {UnauthorizedException.class, AuthorizationException.class}) public String authorizationException(HttpServletRequest request, HttpServletResponse response) { if (isAjaxRequest(request)) { Map map = Maps.newHashMap(); @@ -53,10 +55,45 @@ public abstract class BaseController { } } + @ExceptionHandler( {Exception.class}) + public void runTimeException(HttpServletRequest request, HttpServletResponse response) { + response.setContentType("application/json"); + try { + LenResponse lenResponse = new LenResponse(false, "处理错误"); + response.getWriter().write(JSON.toJSONString(lenResponse)); + } catch (IOException e) { + e.printStackTrace(); + } + } + private static boolean isAjaxRequest(HttpServletRequest request) { String requestedWith = request.getHeader("x-requested-with"); return requestedWith != null && requestedWith.equalsIgnoreCase("XMLHttpRequest"); } + public LenResponse resp(boolean flag, String msg) { + return new LenResponse(flag, msg); + } + + public LenResponse resp(boolean flag) { + return resp(flag, null); + } + + public LenResponse succ(String msg) { + return resp(true, msg); + } + + public LenResponse succ() { + return succ(null); + } + + public LenResponse error(String msg) { + return resp(false, null); + } + + public LenResponse error() { + return error(null); + } + } diff --git a/len-core/src/main/java/com/len/base/BaseService.java b/len-core/src/main/java/com/len/base/BaseService.java index d4c248f..f07f725 100644 --- a/len-core/src/main/java/com/len/base/BaseService.java +++ b/len-core/src/main/java/com/len/base/BaseService.java @@ -19,5 +19,5 @@ public interface BaseService extends IService { public ReType getList(T t, int page, int limit); - public String showAll(T t); + public List showAll(T t); } diff --git a/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java b/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java index 015d033..2840fcc 100644 --- a/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java +++ b/len-core/src/main/java/com/len/base/impl/AbstractServiceImpl.java @@ -17,7 +17,7 @@ import java.util.List; * @author zhuxiaomeng * @date 2017/12/13. * @email 154040976@qq.com - * update by 2019/11/12 tkmapper替换成mybatisplus + * update by 2019/11/12 mybatisplus */ @Slf4j public class AbstractServiceImpl extends ServiceImpl, T> implements BaseService { @@ -45,7 +45,7 @@ public class AbstractServiceImpl extends ServiceImpl< } @Override - public String showAll(T t) { + public List showAll(T t) { List tList = null; try { tList = getBaseMapper().selectListByPage(t); @@ -53,7 +53,7 @@ public class AbstractServiceImpl extends ServiceImpl< log.error("class:BaseServiceImpl ->method:show->message:" + e.getMessage()); e.printStackTrace(); } - return JSON.toJSONString(tList); + return tList; } @Override diff --git a/len-sys/src/main/java/com/len/controller/JobController.java b/len-sys/src/main/java/com/len/controller/JobController.java index 47437a7..e7a4293 100644 --- a/len-sys/src/main/java/com/len/controller/JobController.java +++ b/len-sys/src/main/java/com/len/controller/JobController.java @@ -5,7 +5,6 @@ import com.len.core.annotation.Log; import com.len.core.annotation.Log.LOG_TYPE; import com.len.core.quartz.JobTask; import com.len.entity.SysJob; -import com.len.exception.MyException; import com.len.service.JobService; import com.len.util.LenResponse; import com.len.util.ReType; @@ -30,7 +29,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @Controller @RequestMapping("/job") -@Api(value = "定时任务",tags="定时任务") +@Api(value = "定时任务", tags = "定时任务") public class JobController extends BaseController { @Autowired @@ -62,18 +61,9 @@ public class JobController extends BaseController { @PostMapping(value = "addJob") @ResponseBody public LenResponse addJob(SysJob job) { - LenResponse j = new LenResponse(); - String msg = "保存成功"; job.setStatus(false); - try { - jobService.save(job); - } catch (MyException e) { - msg = "保存失败"; - j.setFlag(false); - e.printStackTrace(); - } - j.setMsg(msg); - return j; + jobService.save(job); + return succ("保存成功"); } @GetMapping(value = "updateJob") @@ -92,23 +82,17 @@ public class JobController extends BaseController { @PostMapping(value = "updateJob") @ResponseBody public LenResponse updateJob(SysJob job) { - LenResponse lenResponse = new LenResponse(); - lenResponse.setFlag(false); if (job == null) { - lenResponse.setMsg("获取数据失败"); - return lenResponse; + return error("获取数据失败"); } if (jobTask.checkJob(job)) { - lenResponse.setMsg("已经启动任务无法更新,请停止后更新"); - return lenResponse; + return error("已经启动任务无法更新,请停止后更新"); } if (jobService.updateJob(job)) { - lenResponse.setFlag(true); - lenResponse.setData("更新成功"); + return succ("更新成功"); } else { - lenResponse.setData("更新失败"); + return error("更新失败"); } - return lenResponse; } @Log(desc = "删除任务", type = LOG_TYPE.DEL) @@ -126,20 +110,16 @@ public class JobController extends BaseController { @ResponseBody @RequiresPermissions("job:start") public LenResponse startJob(String id) { - LenResponse j = new LenResponse(); - String msg = null; + String msg; if (StringUtils.isEmpty(id)) { - j.setMsg("获取数据失败"); - j.setFlag(false); - return j; + return error("获取数据失败"); } if (jobService.startJob(id)) { msg = "启动成功"; } else { msg = "启动失败"; } - j.setMsg(msg); - return j; + return succ(msg); } @Log(desc = "停止任务") @@ -147,20 +127,16 @@ public class JobController extends BaseController { @ResponseBody @RequiresPermissions("job:end") public LenResponse endJob(String id) { - LenResponse j = new LenResponse(); String msg; if (StringUtils.isEmpty(id)) { - j.setMsg("获取数据失败"); - j.setFlag(false); - return j; + return error("获取数据失败"); } if (jobService.stopJob(id)) { msg = "停止成功"; } else { msg = "停止失败"; } - j.setMsg(msg); - return j; + return succ(msg); } } diff --git a/len-sys/src/main/java/com/len/controller/LogController.java b/len-sys/src/main/java/com/len/controller/LogController.java index 9f8d57d..1430ba5 100644 --- a/len-sys/src/main/java/com/len/controller/LogController.java +++ b/len-sys/src/main/java/com/len/controller/LogController.java @@ -8,9 +8,6 @@ import com.len.exception.MyException; import com.len.mapper.SysLogMapper; import com.len.util.LenResponse; import com.len.util.ReType; - -import java.util.List; - import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +18,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import java.util.List; + /** * @author zhuxiaomeng * @date 2017/12/29. @@ -31,7 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping(value = "/log") @Slf4j -@Api(value = "日志管理",tags="操作日志记录") +@Api(value = "日志管理", tags = "操作日志记录") public class LogController extends BaseController { @Autowired private SysLogMapper logMapper; @@ -72,18 +71,10 @@ public class LogController extends BaseController { @PostMapping(value = "del") @ResponseBody public LenResponse del(String[] ids) { - LenResponse j = new LenResponse(); - String msg = "删除成功"; - try { - for (String id : ids) { - logMapper.deleteById(Integer.valueOf(id)); - } - } catch (MyException e) { - msg = "删除失败"; - log.error(msg + e.getMessage()); + for (String id : ids) { + logMapper.deleteById(Integer.valueOf(id)); } - j.setMsg(msg); - return j; + return succ("删除成功"); } diff --git a/len-sys/src/main/java/com/len/controller/LoginController.java b/len-sys/src/main/java/com/len/controller/LoginController.java index 3c55428..03fe4dd 100644 --- a/len-sys/src/main/java/com/len/controller/LoginController.java +++ b/len-sys/src/main/java/com/len/controller/LoginController.java @@ -32,7 +32,7 @@ import javax.servlet.http.HttpSession; */ @Controller @Slf4j -@Api(value = "登录业务",tags="登录校验处理") +@Api(value = "登录业务", tags = "登录校验处理") public class LoginController { @Autowired @@ -58,9 +58,7 @@ public class LoginController { @GetMapping(value = "/login") public String loginCheck() { Subject sub = SecurityUtils.getSubject(); - Boolean flag2 = sub.isRemembered(); - boolean flag = sub.isAuthenticated() || flag2; - if (flag) { + if (sub.isAuthenticated() || sub.isRemembered()) { return "/main/main"; } return "/login2"; @@ -83,7 +81,7 @@ public class LoginController { return "/login2"; }*/ CustomUsernamePasswordToken token = new CustomUsernamePasswordToken(user.getUsername().trim(), - user.getPassword(), "UserLogin"); + user.getPassword(), "UserLogin"); Subject subject = Principal.getSubject(); String msg = null; try { diff --git a/len-sys/src/main/java/com/len/controller/MenuController.java b/len-sys/src/main/java/com/len/controller/MenuController.java index 267d607..d376d96 100644 --- a/len-sys/src/main/java/com/len/controller/MenuController.java +++ b/len-sys/src/main/java/com/len/controller/MenuController.java @@ -5,7 +5,6 @@ import com.len.base.BaseController; import com.len.core.annotation.Log; import com.len.core.annotation.Log.LOG_TYPE; import com.len.entity.SysMenu; -import com.len.exception.MyException; import com.len.service.MenuService; import com.len.util.BeanUtil; import com.len.util.LenResponse; @@ -29,7 +28,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @RequestMapping("/menu") @Controller -@Api(value = "菜单管理",tags="菜单业务处理") +@Api(value = "菜单管理", tags = "菜单业务处理") public class MenuController extends BaseController { @Autowired @@ -61,12 +60,9 @@ public class MenuController extends BaseController { @ApiOperation(value = "/addMenu", httpMethod = "POST", notes = "添加菜单") @PostMapping(value = "addMenu") @ResponseBody - public LenResponse addMenu(SysMenu sysMenu, Model model) { - LenResponse lenResponse = new LenResponse(); - lenResponse.setFlag(false); + public LenResponse addMenu(SysMenu sysMenu) { if (sysMenu == null) { - lenResponse.setMsg("获取数据失败"); - return lenResponse; + return error("获取数据失败"); } if (StringUtils.isEmpty(sysMenu.getPId())) { sysMenu.setPId(null); @@ -77,18 +73,11 @@ public class MenuController extends BaseController { if (StringUtils.isEmpty(sysMenu.getPermission())) { sysMenu.setPermission(null); } - - try { - if (sysMenu.getMenuType() == 2) { - sysMenu.setMenuType((byte) 0); - } - menuService.save(sysMenu); - lenResponse.setMsg("添加成功"); - } catch (MyException e) { - e.printStackTrace(); - lenResponse.setMsg("添加失败"); + if (sysMenu.getMenuType() == 2) { + sysMenu.setMenuType((byte) 0); } - return lenResponse; + menuService.save(sysMenu); + return succ("添加成功"); } @GetMapping(value = "showUpdateMenu") @@ -112,7 +101,7 @@ public class MenuController extends BaseController { SysMenu oldMenu = menuService.getById(sysMenu.getId()); BeanUtil.copyNotNullBean(sysMenu, oldMenu); menuService.updateById(oldMenu); - return LenResponse.sucess("保存成功"); + return succ("保存成功"); } @Log(desc = "删除菜单", type = LOG_TYPE.DEL) diff --git a/len-sys/src/main/java/com/len/controller/PersonController.java b/len-sys/src/main/java/com/len/controller/PersonController.java index e26e1e7..4ca0ac7 100644 --- a/len-sys/src/main/java/com/len/controller/PersonController.java +++ b/len-sys/src/main/java/com/len/controller/PersonController.java @@ -1,11 +1,11 @@ package com.len.controller; +import com.len.base.BaseController; import com.len.base.CurrentUser; import com.len.core.annotation.Log; import com.len.core.shiro.Principal; import com.len.entity.SysUser; import com.len.service.SysUserService; -import com.len.util.BeanUtil; import com.len.util.Checkbox; import com.len.util.LenResponse; import io.swagger.annotations.Api; @@ -27,14 +27,14 @@ import java.util.List; */ @Controller @RequestMapping("/person") -@Api(value = "个人业务",tags="个人业务处理") -public class PersonController { +@Api(value = "个人业务", tags = "个人业务处理") +public class PersonController extends BaseController { @Autowired SysUserService userService; @GetMapping("/index") - public String main(){ + public String main() { return "/main/index"; } @@ -57,18 +57,10 @@ public class PersonController { @PostMapping(value = "updateUser") @ResponseBody public LenResponse updatePerson(SysUser user) { - LenResponse jsonUtil = new LenResponse(); - jsonUtil.setFlag(false); if (user == null) { - jsonUtil.setMsg("获取数据失败"); - return jsonUtil; + return error("获取数据失败"); } - SysUser oldUser = userService.getById(user.getId()); - BeanUtil.copyNotNullBean(user, oldUser); - userService.updateById(oldUser); - jsonUtil.setFlag(true); - jsonUtil.setMsg("修改成功"); - userService.updateCurrent(user); - return jsonUtil; + userService.updatePerson(user); + return succ("修改成功"); } } diff --git a/len-sys/src/main/java/com/len/controller/RoleController.java b/len-sys/src/main/java/com/len/controller/RoleController.java index e045c8d..486510e 100644 --- a/len-sys/src/main/java/com/len/controller/RoleController.java +++ b/len-sys/src/main/java/com/len/controller/RoleController.java @@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import java.util.List; + /** * @author zhuxiaomeng * @date 2017/12/19. @@ -30,7 +32,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @Controller @RequestMapping(value = "/role") -@Api(value = "用户角色管理",tags="角色业务处理") +@Api(value = "用户角色管理", tags = "角色业务处理") public class RoleController extends BaseController { @Autowired @@ -44,7 +46,7 @@ public class RoleController extends BaseController { @GetMapping(value = "showRole") @RequiresPermissions(value = "role:show") - public String showRole(Model model) { + public String showRole() { return "/system/role/roleList"; } @@ -52,7 +54,7 @@ public class RoleController extends BaseController { @GetMapping(value = "showRoleList") @ResponseBody @RequiresPermissions("role:show") - public ReType showRoleList(SysRole role, Model model, String page, String limit) { + public ReType showRoleList(SysRole role, String page, String limit) { return roleService.show(role, Integer.valueOf(page), Integer.valueOf(limit)); } @@ -60,7 +62,7 @@ public class RoleController extends BaseController { @GetMapping(value = "showaLLRoleList") @ResponseBody @RequiresPermissions("role:show") - public String showRoleList(SysRole role, Model model) { + public List showRoleList(SysRole role) { return roleService.showAll(role); } @@ -78,7 +80,7 @@ public class RoleController extends BaseController { @ResponseBody public LenResponse addRole(SysRole sysRole, String[] menus) { if (StringUtils.isEmpty(sysRole.getRoleName())) { - LenResponse.error("角色名称不能为空"); + return error("角色名称不能为空"); } return roleService.addRole(sysRole, menus); } @@ -101,7 +103,7 @@ public class RoleController extends BaseController { @ResponseBody public LenResponse updateUser(SysRole role, String[] menus) { if (role == null) { - return LenResponse.error("获取数据失败"); + return error("获取数据失败"); } return roleService.updateUser(role, menus); } @@ -113,7 +115,7 @@ public class RoleController extends BaseController { @RequiresPermissions("role:del") public LenResponse del(String id) { if (StringUtils.isEmpty(id)) { - return LenResponse.error("获取数据失败"); + return error("获取数据失败"); } return roleService.del(id); } diff --git a/len-sys/src/main/java/com/len/controller/UserController.java b/len-sys/src/main/java/com/len/controller/UserController.java index 2bdf489..37af517 100644 --- a/len-sys/src/main/java/com/len/controller/UserController.java +++ b/len-sys/src/main/java/com/len/controller/UserController.java @@ -2,19 +2,20 @@ package com.len.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.len.base.BaseController; import com.len.core.annotation.Log; import com.len.core.annotation.Log.LOG_TYPE; import com.len.core.quartz.JobTask; -import com.len.entity.SysRoleUser; import com.len.entity.SysUser; -import com.len.exception.MyException; import com.len.service.RoleUserService; import com.len.service.SysUserService; -import com.len.util.*; +import com.len.util.Checkbox; +import com.len.util.LenResponse; +import com.len.util.Md5Util; +import com.len.util.ReType; +import com.len.util.UploadUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; @@ -22,11 +23,15 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +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.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; import java.util.List; /** @@ -38,7 +43,7 @@ import java.util.List; //@Api(value="user") @Controller @RequestMapping(value = "/user") -@Api(value = "用户管理",tags="用户管理业务") +@Api(value = "用户管理", tags = "用户管理业务") public class UserController extends BaseController { //private static final Logger @@ -60,14 +65,14 @@ public class UserController extends BaseController { @GetMapping(value = "showUser") @RequiresPermissions("user:show") - public String showUser(Model model) { + public String showUser() { return "/system/user/userList"; } @GetMapping(value = "showUserList") @ResponseBody @RequiresPermissions("user:show") - public ReType showUser(Model model, SysUser user, String page, String limit) { + public ReType showUser(SysUser user, String page, String limit) { return userService.show(user, Integer.valueOf(page), Integer.valueOf(limit)); } @@ -75,7 +80,7 @@ public class UserController extends BaseController { @GetMapping(value = "listByRoleId") @ResponseBody @RequiresPermissions("user:show") - public String showUser(Model model, String roleId, int page, int limit) { + public String showUser(String roleId, int page, int limit) { JSONObject returnValue = new JSONObject(); Page startPage = PageHelper.startPage(page, limit); List users = userService.getUserByRoleId(roleId); @@ -98,38 +103,24 @@ public class UserController extends BaseController { @ResponseBody public LenResponse addUser(SysUser user, String[] role) { if (user == null) { - return LenResponse.error("获取数据失败"); + return error("获取数据失败"); } if (StringUtils.isBlank(user.getUsername())) { - return LenResponse.error("用户名不能为空"); + return error("用户名不能为空"); } if (StringUtils.isBlank(user.getPassword())) { - return LenResponse.error("密码不能为空"); + return error("密码不能为空"); } if (role == null) { - return LenResponse.error("请选择角色"); + return error("请选择角色"); } int result = userService.checkUser(user.getUsername()); if (result > 0) { - return LenResponse.error("用户名已存在"); + return error("用户名已存在"); } - LenResponse j = new LenResponse(); - try { - user.setPassword(Md5Util.getMD5(user.getPassword(),user.getUsername())); - userService.save(user); - SysRoleUser sysRoleUser = new SysRoleUser(); - sysRoleUser.setUserId(user.getId()); - for (String r : role) { - sysRoleUser.setRoleId(r); - roleUserService.save(sysRoleUser); - } - j.setMsg("保存成功"); - } catch (MyException e) { - j.setMsg("保存失败"); - j.setFlag(false); - e.printStackTrace(); - } - return j; + userService.add(user, Arrays.asList(role)); + + return succ(); } @GetMapping(value = "updateUser") @@ -145,42 +136,17 @@ public class UserController extends BaseController { return "system/user/update-user"; } + @ApiOperation(value = "/updateUser", httpMethod = "POST", notes = "更新用户") @Log(desc = "更新用户", type = LOG_TYPE.UPDATE) @PostMapping(value = "updateUser") @ResponseBody - public LenResponse updateUser(SysUser user, String role[]) { - LenResponse jsonUtil = new LenResponse(); - jsonUtil.setFlag(false); + public LenResponse updateUser(SysUser user, String[] role) { if (user == null) { - jsonUtil.setMsg("获取数据失败"); - return jsonUtil; - } - try { - SysUser oldUser = userService.getById(user.getId()); - BeanUtil.copyNotNullBean(user, oldUser); - userService.updateById(oldUser); - - SysRoleUser sysRoleUser = new SysRoleUser(); - sysRoleUser.setUserId(oldUser.getId()); - List keyList = userService.selectByCondition(sysRoleUser); - for (SysRoleUser currentRoleUser : keyList) { - QueryWrapper queryWrapper = new QueryWrapper<>(currentRoleUser); - roleUserService.remove(queryWrapper); - } - if (role != null) { - for (String r : role) { - sysRoleUser.setRoleId(r); - roleUserService.save(sysRoleUser); - } - } - jsonUtil.setFlag(true); - jsonUtil.setMsg("修改成功"); - userService.updateCurrent(user); - } catch (MyException e) { - e.printStackTrace(); + return error("获取数据失败"); } - return jsonUtil; + userService.updateUser(user, Arrays.asList(role)); + return succ("修改成功"); } @Log(desc = "删除用户", type = LOG_TYPE.DEL) @@ -206,7 +172,6 @@ public class UserController extends BaseController { * 修改密码 * * @param id - * @param pass * @param newPwd * @return */ @@ -214,35 +179,20 @@ public class UserController extends BaseController { @PostMapping(value = "rePass") @ResponseBody @RequiresPermissions("user:repass") - public LenResponse rePass(String id, String pass, String newPwd) { - boolean flag = StringUtils.isEmpty(id) || StringUtils.isEmpty(pass) || StringUtils.isEmpty(newPwd); - LenResponse j = new LenResponse(); - j.setFlag(false); + public LenResponse rePass(String id, String newPwd) { + boolean flag = StringUtils.isEmpty(id) || StringUtils.isEmpty(newPwd); if (flag) { - j.setMsg("获取数据失败,修改失败"); - return j; + return error("获取数据失败,修改失败"); } SysUser user = userService.getById(id); newPwd = Md5Util.getMD5(newPwd, user.getUsername()); - pass = Md5Util.getMD5(pass, user.getUsername()); - if (!pass.equals(user.getPassword())) { - j.setMsg("密码不正确"); - return j; - } if (newPwd.equals(user.getPassword())) { - j.setMsg("新密码不能与旧密码相同"); - - return j; + return resp(false, "新密码不能与旧密码相同"); } user.setPassword(newPwd); - try { - userService.rePass(user); - j.setMsg("修改成功"); - j.setFlag(true); - } catch (MyException e) { - e.printStackTrace(); - } - return j; + userService.rePass(user); + + return succ("修改成功"); } @Autowired @@ -253,8 +203,7 @@ public class UserController extends BaseController { */ @PostMapping(value = "upload") @ResponseBody - public LenResponse imgUpload(HttpServletRequest req, @RequestParam("file") MultipartFile file, - ModelMap model) { + public LenResponse imgUpload(HttpServletRequest req, @RequestParam("file") MultipartFile file) { String fileName = uploadUtil.upload(file); LenResponse j = new LenResponse(); j.setMsg(fileName); @@ -266,21 +215,15 @@ public class UserController extends BaseController { */ @GetMapping(value = "checkUser") @ResponseBody - public LenResponse checkUser(String uname, HttpServletRequest req) { - LenResponse j = new LenResponse(); - j.setFlag(Boolean.FALSE); + public LenResponse checkUser(String uname) { if (StringUtils.isEmpty(uname)) { - j.setMsg("获取数据失败"); - return j; + return error("获取数据失败"); } int result = userService.checkUser(uname); if (result > 0) { - j.setMsg("用户名已存在"); - return j; + return error("用户名已存在"); } - j.setFlag(true); - return j; - + return succ(); } diff --git a/len-sys/src/main/java/com/len/service/SysUserService.java b/len-sys/src/main/java/com/len/service/SysUserService.java index 2a3e2a3..5a66f04 100644 --- a/len-sys/src/main/java/com/len/service/SysUserService.java +++ b/len-sys/src/main/java/com/len/service/SysUserService.java @@ -19,12 +19,21 @@ public interface SysUserService extends BaseService { SysUser login(String username); /** - * 新增 + * 新增用户和用户角色信息 * + * @param user 用户对象 + * @param role 角色列表 + * @return + */ + boolean add(SysUser user, List role); + + /** + * 更新用户和用户角色信息 * @param user + * @param role * @return */ - int add(SysUser user); + boolean updateUser(SysUser user, List role); /** * 删除 @@ -55,4 +64,6 @@ public interface SysUserService extends BaseService { void setMenuAndRoles(String username); void updateCurrent(SysUser user); + + boolean updatePerson(SysUser user); } diff --git a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java index 71ceb85..389ef46 100644 --- a/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/JobServiceImpl.java @@ -53,53 +53,38 @@ public class JobServiceImpl extends BaseServiceImpl implements J j.setMsg("获取数据失败"); return j; } - try { - SysJob job = getById(id); - boolean flag = jobTask.checkJob(job); - if ((flag && !job.getStatus()) || !flag && job.getStatus()) { - j.setMsg("您任务表状态和web任务状态不一致,无法删除"); - return j; - } - if (flag) { - j.setMsg("该任务处于启动中,无法删除"); - return j; - } - removeById(id); - j.setFlag(true); - j.setMsg("任务删除成功"); - } catch (MyException e) { - j.setMsg("任务删除异常"); - e.printStackTrace(); + SysJob job = getById(id); + boolean flag = jobTask.checkJob(job); + if ((flag && !job.getStatus()) || !flag && job.getStatus()) { + j.setMsg("您任务表状态和web任务状态不一致,无法删除"); + return j; + } + if (flag) { + j.setMsg("该任务处于启动中,无法删除"); + return j; } + removeById(id); + j.setFlag(true); + j.setMsg("任务删除成功"); + return j; } @Override public boolean startJob(String id) { - try { - SysJob job = getById(id); - jobTask.startJob(job); - job.setStatus(true); - updateById(job); - return true; - } catch (MyException e) { - log.error(e.getMessage()); - e.printStackTrace(); - } - return false; + SysJob job = getById(id); + jobTask.startJob(job); + job.setStatus(true); + updateById(job); + return true; } @Override public boolean stopJob(String id) { - try { - SysJob job = getById(id); - jobTask.remove(job); - job.setStatus(false); - updateById(job); - return true; - } catch (MyException e) { - e.printStackTrace(); - } - return false; + SysJob job = getById(id); + jobTask.remove(job); + job.setStatus(false); + updateById(job); + return true; } } diff --git a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java index b4adb6a..480d057 100644 --- a/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/MenuServiceImpl.java @@ -49,14 +49,13 @@ public class MenuServiceImpl extends BaseServiceImpl implements return menuDao.getMenuChildren(id); } - public SysMenu child(SysMenu sysMenu, List sysMenus, Integer pNum, Integer num) { + public SysMenu child(SysMenu sysMenu, List sysMenus, Integer num) { List childSysMenu = sysMenus.stream().filter(s -> s.getPId().equals(sysMenu.getId())).collect(Collectors.toList()); sysMenus.removeAll(childSysMenu); - SysMenu m; for (SysMenu menu : childSysMenu) { ++num; - m = child(menu, sysMenus, pNum, num); + child(menu, sysMenus, num); sysMenu.addChild(menu); } return sysMenu; @@ -72,7 +71,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements supers.sort(Comparator.comparingInt(SysMenu::getOrderNum)); JSONArray jsonArr = new JSONArray(); for (SysMenu sysMenu : supers) { - SysMenu child = child(sysMenu, sysMenus, 0, 0); + SysMenu child = child(sysMenu, sysMenus, 0); jsonArr.add(child); } return jsonArr; @@ -81,7 +80,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements @Override public JSONArray getMenuJsonByUser(List menuList) { JSONArray jsonArr = new JSONArray(); - Collections.sort(menuList, (o1, o2) -> { + menuList.sort((o1, o2) -> { if (o1.getOrderNum() == null || o2.getOrderNum() == null) { return -1; } @@ -160,7 +159,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements @Override public JSONArray getTreeUtil(String roleId) { - TreeUtil treeUtil = null; + TreeUtil treeUtil; List sysMenus = list(); List supers = sysMenus.stream().filter(sysMenu -> StringUtils.isEmpty(sysMenu.getPId())) @@ -181,7 +180,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements return menuDao.getUserMenu(id); } - public TreeUtil getChildByTree(SysMenu sysMenu, List sysMenus, int layer, String pId, String roleId) { + private TreeUtil getChildByTree(SysMenu sysMenu, List sysMenus, int layer, String pId, String roleId) { layer++; List childSysMenu = sysMenus.stream().filter(s -> s.getPId().equals(sysMenu.getId())).collect(Collectors.toList()); @@ -191,7 +190,7 @@ public class MenuServiceImpl extends BaseServiceImpl implements treeUtil.setName(sysMenu.getName()); treeUtil.setLayer(layer); treeUtil.setPId(pId); - /**判断是否存在*/ + /*判断是否存在*/ if (!StringUtils.isEmpty(roleId)) { SysRoleMenu sysRoleMenu = new SysRoleMenu(); sysRoleMenu.setMenuId(sysMenu.getId()); diff --git a/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java index 2fc2d7f..f735e02 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleMenuServiceImpl.java @@ -18,6 +18,7 @@ import java.util.List; @Service public class RoleMenuServiceImpl extends BaseServiceImpl implements RoleMenuService { + @Autowired private SysRoleMenuMapper roleMenuMapper; diff --git a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java index 7a69ddf..8ba6240 100644 --- a/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/RoleServiceImpl.java @@ -5,14 +5,12 @@ import com.len.base.impl.BaseServiceImpl; import com.len.entity.SysRole; import com.len.entity.SysRoleMenu; import com.len.entity.SysRoleUser; -import com.len.exception.MyException; import com.len.mapper.SysRoleMapper; import com.len.service.RoleMenuService; import com.len.service.RoleService; import com.len.service.RoleUserService; import com.len.util.BeanUtil; import com.len.util.LenResponse; -import com.len.util.UuidUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -36,33 +34,21 @@ public class RoleServiceImpl extends BaseServiceImpl implements private RoleUserService roleUserService; - /*@Override - public int insert(SysRole record) { - record = super.addValue(record, true); - return roleMapper.insert(record); - }*/ - @Override public LenResponse addRole(SysRole sysRole, String[] menus) { LenResponse j = new LenResponse(); - try { - roleMapper.insert(sysRole); - //操作role-menu data - - if (menus != null) { - for (String menu : menus) { - SysRoleMenu sysRoleMenu = new SysRoleMenu(); - sysRoleMenu.setRoleId(sysRole.getId()); - sysRoleMenu.setMenuId(menu); - roleMenuService.save(sysRoleMenu); - } + roleMapper.insert(sysRole); + //操作role-menu data + if (menus != null) { + for (String menu : menus) { + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setRoleId(sysRole.getId()); + sysRoleMenu.setMenuId(menu); + roleMenuService.save(sysRoleMenu); } - j.setMsg("保存成功"); - } catch (MyException e) { - j.setMsg("保存失败"); - j.setFlag(false); - e.printStackTrace(); } + j.setMsg("保存成功"); + return j; } @@ -70,29 +56,25 @@ public class RoleServiceImpl extends BaseServiceImpl implements public LenResponse updateUser(SysRole role, String[] menus) { LenResponse jsonUtil = new LenResponse(); jsonUtil.setFlag(false); - try { - SysRole oldRole = roleMapper.selectById(role.getId()); - BeanUtil.copyNotNullBean(role, oldRole); - roleMapper.updateById(oldRole); + SysRole oldRole = roleMapper.selectById(role.getId()); + BeanUtil.copyNotNullBean(role, oldRole); + roleMapper.updateById(oldRole); - SysRoleMenu sysRoleMenu = new SysRoleMenu(); - sysRoleMenu.setRoleId(role.getId()); - List menuList = roleMenuService.selectByCondition(sysRoleMenu); - for (SysRoleMenu sysRoleMenu1 : menuList) { - roleMenuService.deleteByPrimaryKey(sysRoleMenu1); - } - if (menus != null) { - for (String menu : menus) { - sysRoleMenu.setMenuId(menu); - roleMenuService.save(sysRoleMenu); - } + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setRoleId(role.getId()); + List menuList = roleMenuService.selectByCondition(sysRoleMenu); + for (SysRoleMenu sysRoleMenu1 : menuList) { + roleMenuService.deleteByPrimaryKey(sysRoleMenu1); + } + if (menus != null) { + for (String menu : menus) { + sysRoleMenu.setMenuId(menu); + roleMenuService.save(sysRoleMenu); } - jsonUtil.setFlag(true); - jsonUtil.setMsg("修改成功"); - } catch (MyException e) { - jsonUtil.setMsg("修改失败"); - e.printStackTrace(); } + jsonUtil.setFlag(true); + jsonUtil.setMsg("修改成功"); + return jsonUtil; } @@ -101,19 +83,13 @@ public class RoleServiceImpl extends BaseServiceImpl implements SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setRoleId(id); LenResponse j = new LenResponse(); - try { - QueryWrapper wrapper = new QueryWrapper<>(sysRoleUser); - int count = roleUserService.count(wrapper); - if (count > 0) { - return LenResponse.error("已分配给用户,删除失败"); - } - roleMapper.deleteById(id); - j.setMsg("删除成功"); - } catch (MyException e) { - j.setMsg("删除失败"); - j.setFlag(false); - e.printStackTrace(); + QueryWrapper wrapper = new QueryWrapper<>(sysRoleUser); + int count = roleUserService.count(wrapper); + if (count > 0) { + return LenResponse.error("已分配给用户,删除失败"); } + roleMapper.deleteById(id); + j.setMsg("删除成功"); return j; } } diff --git a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java index d81857c..8fc7783 100644 --- a/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java +++ b/len-sys/src/main/java/com/len/service/impl/SysUserServiceImpl.java @@ -2,7 +2,6 @@ package com.len.service.impl; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.len.base.BaseMapper; import com.len.base.CurrentMenu; import com.len.base.CurrentRole; import com.len.base.CurrentUser; @@ -12,7 +11,6 @@ import com.len.entity.SysMenu; import com.len.entity.SysRole; import com.len.entity.SysRoleUser; import com.len.entity.SysUser; -import com.len.exception.MyException; import com.len.mapper.SysRoleUserMapper; import com.len.mapper.SysUserMapper; import com.len.service.MenuService; @@ -23,15 +21,15 @@ import com.len.util.BeanUtil; import com.len.util.Checkbox; import com.len.util.LenResponse; import com.len.util.Md5Util; -import java.util.ArrayList; -import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -59,9 +57,6 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme private static final String ADMIN = "admin"; -// -// String pwd = Md5Util.getMD5(record.getPassword().trim(), record.getUsername().trim()); -// record.setPassword(pwd); @Override public SysUser login(String username) { return sysUserMapper.login(username); @@ -80,11 +75,41 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme } @Override - public int add(SysUser user) { + public boolean add(SysUser user, List role) { //密码加密 - String pwd = Md5Util.getMD5(user.getPassword().trim(), user.getUsername().trim()); - user.setPassword(pwd); - return sysUserMapper.add(user); + user.setPassword(Md5Util.getMD5(user.getPassword(), user.getUsername())); + boolean save = save(user); + SysRoleUser sysRoleUser = new SysRoleUser(); + sysRoleUser.setUserId(user.getId()); + for (String r : role) { + sysRoleUser.setRoleId(r); + roleUserService.save(sysRoleUser); + } + return save; + } + + @Override + public boolean updateUser(SysUser user, List role) { + SysUser oldUser = getById(user.getId()); + BeanUtil.copyNotNullBean(user, oldUser); + updateById(oldUser); + + SysRoleUser sysRoleUser = new SysRoleUser(); + sysRoleUser.setUserId(oldUser.getId()); + List keyList = selectByCondition(sysRoleUser); + for (SysRoleUser currentRoleUser : keyList) { + QueryWrapper queryWrapper = new QueryWrapper<>(currentRoleUser); + roleUserService.remove(queryWrapper); + } + + if (role != null) { + for (String r : role) { + sysRoleUser.setRoleId(r); + roleUserService.save(sysRoleUser); + } + } + updateCurrent(user); + return true; } @Override @@ -93,32 +118,27 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme return LenResponse.error("获取数据失败"); } LenResponse j = new LenResponse(); - try { - SysUser sysUser = sysUserMapper.selectById(id); - if (ADMIN.equals(sysUser.getUsername())) { - return LenResponse.error("超管无法删除"); - } - SysRoleUser roleUser = new SysRoleUser(); - roleUser.setUserId(id); - QueryWrapper wrapper=new QueryWrapper<>(roleUser); - int count = roleUserService.count(wrapper); - if (count > 0) { - return LenResponse.error("账户已经绑定角色,无法删除"); - } - if (flag) { - //逻辑 - sysUser.setDelFlag(Byte.parseByte("1")); - sysUserMapper.updateById(sysUser); - } else { - //物理 - sysUserMapper.delById(id); - } - j.setMsg("删除成功"); - } catch (MyException e) { - j.setMsg("删除失败"); - j.setFlag(false); - e.printStackTrace(); + SysUser sysUser = sysUserMapper.selectById(id); + if (ADMIN.equals(sysUser.getUsername())) { + return LenResponse.error("超管无法删除"); + } + SysRoleUser roleUser = new SysRoleUser(); + roleUser.setUserId(id); + QueryWrapper wrapper = new QueryWrapper<>(roleUser); + int count = roleUserService.count(wrapper); + if (count > 0) { + return LenResponse.error("账户已经绑定角色,无法删除"); } + if (flag) { + //逻辑 + sysUser.setDelFlag(Byte.parseByte("1")); + sysUserMapper.updateById(sysUser); + } else { + //物理 + sysUserMapper.delById(id); + } + int i = 1 / 0; + j.setMsg("删除成功"); return j; } @@ -163,12 +183,11 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme } - @Override public void setMenuAndRoles(String username) { SysUser s = new SysUser(); s.setUsername(username); - QueryWrapper userQueryWrapper=new QueryWrapper<>(s); + QueryWrapper userQueryWrapper = new QueryWrapper<>(s); s = sysUserMapper.selectOne(userQueryWrapper); CurrentUser currentUser = new CurrentUser(s.getId(), s.getUsername(), s.getAge(), s.getEmail(), s.getPhoto(), s.getRealName()); Subject subject = Principal.getSubject(); @@ -178,7 +197,7 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme List menuList = menuService.getUserMenu(s.getId()); JSONArray json = menuService.getMenuJsonByUser(menuList); - session.setAttribute("menu", json); + session.setAttribute("menu", json.toJSONString()); List currentMenuList = new ArrayList<>(); @@ -208,13 +227,21 @@ public class SysUserServiceImpl extends BaseServiceImpl impleme @Override public void updateCurrent(SysUser sysUser) { CurrentUser principal = Principal.getPrincipal(); - if(principal.getId().equals(sysUser.getId())){ + if (principal.getId().equals(sysUser.getId())) { //当前用户 CurrentUser currentUse = Principal.getCurrentUse(); - Session session=Principal.getSession(); + Session session = Principal.getSession(); currentUse.setPhoto(sysUser.getPhoto()); - session.setAttribute("currentPrincipal",currentUse); - + session.setAttribute("currentPrincipal", currentUse); } } + + @Override + public boolean updatePerson(SysUser user) { + SysUser oldUser = getById(user.getId()); + BeanUtil.copyNotNullBean(user, oldUser); + updateById(oldUser); + updateCurrent(user); + return true; + } } diff --git a/len-sys/src/main/resources/ftl/system/user/re-pass.ftl b/len-sys/src/main/resources/ftl/system/user/re-pass.ftl index 8242b41..e764015 100644 --- a/len-sys/src/main/resources/ftl/system/user/re-pass.ftl +++ b/len-sys/src/main/resources/ftl/system/user/re-pass.ftl @@ -22,16 +22,6 @@ To change this template use File | Settings | File Templates.--> 修改账户:${user.username} -
        - -
        - - -
        -
        @@ -66,11 +66,8 @@
        - 忘记密码? +
        -
        @@ -88,9 +85,16 @@ // 是否两周内自动登录 - /* $('.icon-nocheck, .login-tip').click(function () { + $('.icon-nocheck, .login-tip').click(function () { $('.icon-nocheck').toggleClass('icon-check'); - });*/ + var isRemember=$('#isRemember').val(); + if(isRemember==='false'){ + isRemember='true'; + }else{ + isRemember='false' + } + $('#isRemember').val(isRemember); + }); layui.use(['form','layer'], function(){ var form = layui.form; form.verify({ diff --git a/len-sys/src/main/resources/plugin/login/hawkEye.min.js b/len-sys/src/main/resources/plugin/login/hawkEye.min.js deleted file mode 100644 index ca8b68d..0000000 --- a/len-sys/src/main/resources/plugin/login/hawkEye.min.js +++ /dev/null @@ -1 +0,0 @@ -window.FAI_HAWK_EYE=!!window.FAI_HAWK_EYE?window.FAI_HAWK_EYE:{};window.FAI_HAWK_EYE.sdk_version=1.1;window.FAI_HAWK_EYE.FAI_HAWK_EYE_REPORT_URL=window.FAI_HAWK_EYE.jssdk_report_url;window.devicePixelRatio=window.devicePixelRatio||window.webkitDevicePixelRatio||window.mozDevicePixelRatio||1;(function(a,b){a._DEF={_MODULE:{_TYPE:{PV_MODULE:0,PERFORMANCE_MODULE:1,EXCEPTION_MODULE:2,CLICK_MODULE:3,EVENT_MODULE:4,BSS_MONITOR_MODULE:5,FAI_SPEED_TEST_MODULE:6},_KEY:{EXCEPTION_MODULE:"e_m",PERFORMANCE_MODULE:"pe_m",EVENT_MODULE:"b_m",PV_MODULE:"p_m",CLICK_MODULE:"c_m",BSS_MONITOR_MODULE:"bm_m",FAI_SPEED_TEST_MODULE:"fst_m"}},_COOKIE:{_AID_COOKIE:"",_BS_ADI_COOKIE:"",_BS_WID_COOKIE:"",_BS_ID_COOKIE:"",_CLI_ID_COOKIE:"_cliid"},_IDTYPE:{_DISTINC_ID:1,_SESSION_ID:2,_PV_ID:3,_CLICK_ID:4},_REPORT:{_BASIC:{_REPORT_TYPE:"b_rt",_PV_ID:"b_pi",_APP_ID:"b_a_i",_SDK_VERSION:"b_sv",_DISTINC_ID:"b_di",_CROSS_DOMAIN_CLI_ID:"b_cdci",_CLI_TIME:"b_ct",_AID:"b_ai",_BS_AID:"b_ba",_BS_WID:"b_bw",_BS_ID:"b_bi"},_URL:{_URL:"u_u",_REFER_URL:"u_ru"},_CLIENT:{_CLI_LANG:"c_l",_CLI_SCREEN_TYPE:"c_st",_CLI_DPR:"c_dpr"},_PERFORMANCE:{_DOMAIN_LOOKUP_TIME:"pe_dt",_TCP_TIME:"pe_tt",_REQUEST_TIME:"pe_rt",_BACK_END_TIME:"pe_rpt",_DOM_PARSE_TIME:"pe_dpt",_WRITER_SCREEN_TIME:"pe_wst",_FIRST_SCREEN_TIME:"pe_fst",_DOM_READY_TIME:"pe_drt",_FINISH_TIME:"pe_ft"},_EXCEPTION:{_EXCEPTION_TYPE:{_JS_EXCEPTION:0,_IMG_EXCEPTION:1,_AJAX_EXCEPTION:2},_TYPE:"e_t",_URL:"e_u",_MESSAGE:"e_m",_STATUS:"e_ss",_STACK:"e_sk",_LINE_NUM:"e_ln",_COL_NUM:"e_cn"},_EVENT:{_EVENT_ID:"ev_i",_EVENT_ID_SUB:"ev_i_s",_EVENT_CONTENT:"ev_c"},_CLICK:{_ID:"c_i",_PATH:"c_e_pa",_NAME:"c_e_n",_POSITION:"c_e_po",_TYPE:"c_t",_TO_URL:"c_t_u",_STEP_PV:"s_i_p"},_PV:{_REFER:"p_r",_TITLE:"p_t",_PV_ID:"p_pi"},_BSS:{_TIME:"bs_t",_MONITOR_ID:"bs_i"}}};a._DATA={};a._MODULES={};a._TOOL={};a._INTERFACE={}})(window.FAI_HAWK_EYE);(function(a,b){a._INTERFACE._install=function(){for(var c in a._MODULES){a._MODULES[c]._init()}};a._TOOL._extend=function(e,c){var d=function(){};d.prototype=c.prototype;e.prototype=new d();e.prototype.constructor=e;e.uber=c.prototype};a._TOOL._getElementPath=function(c){var d=[];do{d.push(a._TOOL._getElementName(c))}while((c.nodeName.toLowerCase()!="html")&&(c=c.parentNode));return d.join(" > ")};a._TOOL._getElementName=function(e){var d=e.className;var c=e.id;if(!!d||!!c){return e.nodeName.toLowerCase()+"["+(d?'class="'+d+'"':"")+(c?' id="'+c+'"':"")+"]"}else{return e.nodeName.toLowerCase()}};a._TOOL._getElementAttribute=function(d,c){var e=d.getAttribute(c);if(e==null||e==b){return""}else{return e}};a._TOOL._getLang=function(){var c=navigator.userLanguage||navigator.language;return c};a._TOOL._getScreenSize=function(){var e=window.screen.width,c=window.screen.height,f=window.devicePixelRatio;var g=parseInt(e*f);var d=parseInt(c*f);return g+"x"+d};a._TOOL._getDevicePixelRatio=function(){return window.devicePixelRatio};a._TOOL._getCookie=function(d){var c,e=new RegExp("(^| )"+d+"=([^;]*)(;|$)");if(c=document.cookie.match(e)){return unescape(c[2])}else{return null}};a._TOOL._getPageReferrer=function(){try{if(!!window.Fai&&!!window.Fai.top&&!!window.Fai.top.document){return window.Fai.top.document.referrer}else{return document.referrer}}catch(c){return document.referrer}};a._TOOL._sendReport=function(d,f){var g="";for(var e in f){g+=e+"="+encodeURIComponent(f[e])+"&"}d+="?"+g;var c=document.createElement("img");c.src=d;document.getElementsByTagName("head")[0].appendChild(c);c.parentNode.removeChild(c)};a._TOOL._getId=function(d){var g=(d).toString(16);if(g.length<2){for(var h=0;h<2-g.length;h++){g="0"+g}}var f=(((new Date().getTime())&4294967295)>>>0).toString(16);if(f.length<8){for(var h=0;h<8-f.length;h++){f="0"+f}}var c=16777215;var e=((Math.random()*c)&16777215).toString(16);if(e.length<6){for(var h=0;h<6-e.length;h++){e="0"+e}}return g+f+e};a._TOOL._getUrlDomain=function(c){var d=c.split("/")[2];if(d==b){d=""}return d}})(window.FAI_HAWK_EYE);(function(b){b.fai_he_pv_id=b._TOOL._getId(b._DEF._IDTYPE._PV_ID);b.fai_he_script_src="";if(document.currentScript&&document.currentScript.src){b.fai_he_script_src=document.currentScript.src}else{if(document.scripts){var a=document.scripts[document.scripts.length-1];if(a.src){b.fai_he_script_src=a.src}}}})(window.FAI_HAWK_EYE);(function(g){var c={};function a(){var l={};var o=g.fai_he_pv_id;var q=g.jssdk_appid;var k=g.sdk_version;var m=g._TOOL._getCookie(g._DEF._COOKIE._CLI_ID_COOKIE);var i=g.fai_aid;var p=g.fai_bs_aid;var j=g.fai_bs_wid;var n=g.fai_bs_id;l[g._DEF._REPORT._BASIC._PV_ID]=o;l[g._DEF._REPORT._BASIC._APP_ID]=q;l[g._DEF._REPORT._BASIC._SDK_VERSION]=k;l[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID]=m;l[g._DEF._REPORT._BASIC._AID]=i;l[g._DEF._REPORT._BASIC._BS_AID]=p;l[g._DEF._REPORT._BASIC._BS_WID]=j;l[g._DEF._REPORT._BASIC._BS_ID]=n;return l}function f(){var i={};var j=document.URL;var k=g._TOOL._getPageReferrer();i[g._DEF._REPORT._URL._URL]=j;i[g._DEF._REPORT._URL._REFER_URL]=k;return i}function e(){var l={};var k=g._TOOL._getLang();var i=g._TOOL._getScreenSize();var j=g._TOOL._getDevicePixelRatio();l[g._DEF._REPORT._CLIENT._CLI_LANG]=k;l[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE]=i;l[g._DEF._REPORT._CLIENT._CLI_DPR]=j;return l}var d=a();var b=f();var h=e();g._DATA[g._DEF._REPORT._BASIC._PV_ID]=d[g._DEF._REPORT._BASIC._PV_ID];g._DATA[g._DEF._REPORT._BASIC._APP_ID]=d[g._DEF._REPORT._BASIC._APP_ID];g._DATA[g._DEF._REPORT._BASIC._SDK_VERSION]=d[g._DEF._REPORT._BASIC._SDK_VERSION];g._DATA[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID]=d[g._DEF._REPORT._BASIC._CROSS_DOMAIN_CLI_ID];g._DATA[g._DEF._REPORT._BASIC._AID]=d[g._DEF._REPORT._BASIC._AID];g._DATA[g._DEF._REPORT._BASIC._BS_AID]=d[g._DEF._REPORT._BASIC._BS_AID];g._DATA[g._DEF._REPORT._BASIC._BS_WID]=d[g._DEF._REPORT._BASIC._BS_WID];g._DATA[g._DEF._REPORT._BASIC._BS_ID]=d[g._DEF._REPORT._BASIC._BS_ID];g._DATA[g._DEF._REPORT._URL._URL]=b[g._DEF._REPORT._URL._URL];g._DATA[g._DEF._REPORT._URL._REFER_URL]=b[g._DEF._REPORT._URL._REFER_URL];g._DATA[g._DEF._REPORT._CLIENT._CLI_LANG]=h[g._DEF._REPORT._CLIENT._CLI_LANG];g._DATA[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE]=h[g._DEF._REPORT._CLIENT._CLI_SCREEN_TYPE];g._DATA[g._DEF._REPORT._CLIENT._CLI_DPR]=h[g._DEF._REPORT._CLIENT._CLI_DPR]})(window.FAI_HAWK_EYE);(function(e,k,c){if(!Function.prototype.bind){Function.prototype.bind=function(l){if(typeof this!=="function"){throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")}var p=Array.prototype.slice.call(arguments,1),o=this,m=function(){},n=function(){return o.apply(this instanceof m?this:l,p.concat(Array.prototype.slice.call(arguments)))};if(this.prototype){m.prototype=this.prototype}n.prototype=new m();return n}}function j(l,m){this._name=l;this._type=m}j.prototype.report=function(m,l){var o={};for(var n in k._DATA){o[n]=k._DATA[n]}for(var n in m){o[n]=m[n]}o[k._DEF._REPORT._BASIC._CLI_TIME]=new Date().getTime();o[k._DEF._REPORT._BASIC._REPORT_TYPE]=l;k._TOOL._sendReport(k.FAI_HAWK_EYE_REPORT_URL,o)};function g(l,m){this._name=l;this._type=m;this._init=function(){var o=this;if(e.addEventListener){e.addEventListener("error",function(q){var r={};if(q.target&&q.target.tagName&&(q.target.tagName.toLocaleLowerCase()=="img")){target_src_domain=k._TOOL._getUrlDomain(q.target.src);self_report_url=k.jssdk_report_url;if(self_report_url.indexOf(target_src_domain)==-1){r[k._DEF._REPORT._EXCEPTION._URL]=q.target.src;r[k._DEF._REPORT._EXCEPTION._STACK]="";r[k._DEF._REPORT._EXCEPTION._STATUS]=0;r[k._DEF._REPORT._EXCEPTION._LINE_NUM]=0;r[k._DEF._REPORT._EXCEPTION._COL_NUM]=0;r[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._IMG_EXCEPTION;o.report(r,o._type)}}},true)}e.onerror=function(u,s,t,B,r){if(u==="Script error."){return}if(s==k.fai_he_script_src){}var y={};var v=s;var x=u;var z="";if(r&&r.stack){z=r.stack}var w=0;var q=t;var A=0;if(B){A=B}y[k._DEF._REPORT._EXCEPTION._URL]=v;y[k._DEF._REPORT._EXCEPTION._MESSAGE]=x;y[k._DEF._REPORT._EXCEPTION._STACK]=z;y[k._DEF._REPORT._EXCEPTION._STATUS]=w;y[k._DEF._REPORT._EXCEPTION._LINE_NUM]=q;y[k._DEF._REPORT._EXCEPTION._COL_NUM]=A;y[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._JS_EXCEPTION;o.report(y,o._type)};if(e.XMLHttpRequest){var p=XMLHttpRequest.prototype.send;var n=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(s,r,q){n.apply(this,[s,r,q]);this.ajaxUrl=r};XMLHttpRequest.prototype.send=function(r){var s={};p.apply(this,[r]);if(this.onreadystatechange){this.newStateChange=q.bind(this)}else{this.onreadystatechange=q.bind(this)}function q(){if(this.readyState==4){if(!(this.status>=200&&this.status<300)){s[k._DEF._REPORT._EXCEPTION._URL]=this.ajaxUrl;s[k._DEF._REPORT._EXCEPTION._STACK]="";s[k._DEF._REPORT._EXCEPTION._STATUS]=this.status;s[k._DEF._REPORT._EXCEPTION._MESSAGE]=this.statusText;s[k._DEF._REPORT._EXCEPTION._LINE_NUM]=0;s[k._DEF._REPORT._EXCEPTION._COL_NUM]=0;s[k._DEF._REPORT._EXCEPTION._TYPE]=k._DEF._REPORT._EXCEPTION._EXCEPTION_TYPE._AJAX_EXCEPTION;o.report(s,o._type)}}}}}}}k._TOOL._extend(g,j);k._MODULES[k._DEF._MODULE._KEY.EXCEPTION_MODULE]=new g("异常监控模块",k._DEF._MODULE._TYPE.EXCEPTION_MODULE);function f(l,m){this._name=l;this._type=m;this._init=function(){var o=this;if(!!e.addEventListener){e.addEventListener("load",function(p){setTimeout(function(){var q=n();o.report(q,o._type)},100)},false)}else{if(!!e.attachEvent){e.attachEvent("onload",function(p){setTimeout(function(){var q=n();o.report(q,o._type)},100)})}}};function n(){var s={};if(!!e.performance&&!!e.performance.timing){var o,x,t,q,v,u,w,p,r=null;o=performance.timing;x=o.domainLookupEnd-o.domainLookupStart;t=o.connectEnd-o.connectStart;q=o.responseEnd-o.requestStart;response_time=o.responseStart-o.navigationStart;v=o.domComplete-o.domInteractive;u=o.domInteractive-o.navigationStart;w=o.domComplete-o.navigationStart;p=o.domContentLoadedEventEnd-o.navigationStart;r=o.loadEventEnd-o.navigationStart;s[k._DEF._REPORT._PERFORMANCE._DOMAIN_LOOKUP_TIME]=x;s[k._DEF._REPORT._PERFORMANCE._TCP_TIME]=t;s[k._DEF._REPORT._PERFORMANCE._REQUEST_TIME]=q;s[k._DEF._REPORT._PERFORMANCE._BACK_END_TIME]=response_time;s[k._DEF._REPORT._PERFORMANCE._DOM_PARSE_TIME]=v;s[k._DEF._REPORT._PERFORMANCE._WRITER_SCREEN_TIME]=u;s[k._DEF._REPORT._PERFORMANCE._FIRST_SCREEN_TIME]=w;s[k._DEF._REPORT._PERFORMANCE._DOM_READY_TIME]=p;s[k._DEF._REPORT._PERFORMANCE._FINISH_TIME]=r}return s}}k._TOOL._extend(f,j);k._MODULES[k._DEF._MODULE._KEY.PERFORMANCE_MODULE]=new f("性能监控模块",k._DEF._MODULE._TYPE.PERFORMANCE_MODULE);function a(l,m){this._name=l;this._type=m;this._datas=[];this._init=function(){var n=this;k.trackEvent=function(r,p,q){var o={};o[k._DEF._REPORT._EVENT._EVENT_ID]=r;o[k._DEF._REPORT._EVENT._EVENT_ID_SUB]=p;o[k._DEF._REPORT._EVENT._EVENT_CONTENT]=q;n.report(o,n._type)}}}k._TOOL._extend(a,j);k._MODULES[k._DEF._MODULE._KEY.EVENT_MODULE]=new a("行为监控模块",k._DEF._MODULE._TYPE.EVENT_MODULE);function h(l,m){this._name=l;this._type=m;this._init=function(){var n=this;var o=(!!k._TOOL._getCookie(k._DEF._COOKIE._CLI_ID_COOKIE))?0:1000;setTimeout(function(){var p={};p[k._DEF._REPORT._PV._REFER]=document.referrer;p[k._DEF._REPORT._PV._TITLE]=document.title;p[k._DEF._REPORT._PV._PV_ID]=k.fai_he_pv_id;n.report(p,n._type)},o)}}k._TOOL._extend(h,j);k._MODULES[k._DEF._MODULE._KEY.PV_MODULE]=new h("PV模块",k._DEF._MODULE._TYPE.PV_MODULE);function b(l,m){this._name=l;this._type=m;this._step_pv=0;this._init=function(){var o=this;if(e.addEventListener){var q=true;var p=null;e.addEventListener("click",function(r){q=true;p=setTimeout(function(){if(q){n(r)}},400)});e.addEventListener("dblclick",function(r){q=false;clearTimeout(p);n(r)})}else{if(e.attachEvent){var q=true;var p=null;document.attachEvent("onclick",function(r){q=true;var s={};s.src=r.srcElement;s.screenX=r.screenX;s.screenY=r.screenY;s.type=r.type;p=setTimeout(function(){if(q){n(s)}},400)});document.attachEvent("ondblclick",function(r){q=false;clearTimeout(p);n(r)})}}function n(v){var w={};o._step_pv++;var s=k._TOOL._getId(k._DEF._IDTYPE._CLICK_ID);var x="";var r="";var t="";if(v.target){x=k._TOOL._getElementPath(v.target);r=k._TOOL._getElementName(v.target);t=k._TOOL._getElementAttribute(v.target,"href")}else{if(v.srcElement){x=k._TOOL._getElementPath(v.srcElement);r=k._TOOL._getElementName(v.srcElement);t=k._TOOL._getElementAttribute(v.srcElement,"href")}}var u=v.screenX+","+v.screenY;var y=v.type;w[k._DEF._REPORT._CLICK._ID]=s;w[k._DEF._REPORT._CLICK._PATH]=x;w[k._DEF._REPORT._CLICK._NAME]=r;w[k._DEF._REPORT._CLICK._POSITION]=u;w[k._DEF._REPORT._CLICK._TYPE]=v.type;w[k._DEF._REPORT._CLICK._TO_URL]=t;w[k._DEF._REPORT._CLICK._STEP_PV]=o._step_pv;o.report(w,o._type)}}}k._TOOL._extend(b,j);function i(l,m){this._name=l;this._type=m;this._init=function(){var n=this;k.bssMonitor=function(o){var p={};p[k._DEF._REPORT._BSS._MONITOR_ID]=o;p[k._DEF._REPORT._URL._URL]=document.URL;p[k._DEF._REPORT._BASIC._REPORT_TYPE]=n._type;k._TOOL._sendReport(k.FAI_HAWK_EYE_REPORT_URL,p)}}}k._TOOL._extend(i,j);k._MODULES[k._DEF._MODULE._KEY.BSS_MONITOR_MODULE]=new i("业务上报模块",k._DEF._MODULE._TYPE.BSS_MONITOR_MODULE);function d(p,q){this._name=p;this._type=q;this.testSeed=1;this._init=function(){var v=this;var u=((k.jssdk_appid==3010)&&(Math.random(1)*10<=5));var t=((k.jssdk_appid==6001)&&(Math.random(1)*10<=2));var s=((k.jssdk_appid==5002)&&(Math.random(1)*10<=1));if(false){if(!!e.addEventListener){e.addEventListener("load",function(w){setTimeout(function(){r()},1000)},false)}}};function n(s){s.domain=k._TOOL._getUrlDomain(s.url);if(!!JSON){k.trackEvent(10000,0,JSON.stringify(s))}}function r(){list=l();for(var s=0;s Date: Sun, 21 Mar 2021 21:52:37 +0800 Subject: [PATCH 28/39] =?UTF-8?q?1=E3=80=81=E5=89=8D=E7=AB=AF=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E9=83=A8=E5=88=86=E7=BB=9F=E4=B8=80=E6=88=90=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=EF=BC=9Abar/btn/foot/formBtn/formHead/head/queryBox/s?= =?UTF-8?q?earth/upload=202=E3=80=81js=E5=85=AC=E5=85=B1=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=8F=90=E5=8F=96=E5=88=B0tools.js=E4=B8=AD=203=E3=80=81?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=8F=98=E9=87=8FlenInclude=20=E7=81=B5=E6=B4=BB=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E6=A8=A1=E6=9D=BF=20=E5=B9=B6=E7=81=B5=E6=B4=BB?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=204=E3=80=81=E5=B7=A5=E4=BD=9C=E6=B5=81=20?= =?UTF-8?q?=E7=AE=80=E6=98=93=E4=BC=98=E5=8C=96=205=E3=80=81ajax=20?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86=E4=B8=9A=E5=8A=A1=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=EF=BC=8C=E7=9C=81=E7=95=A5=E5=89=8D=E7=AB=AF=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=E5=88=A4=E6=96=AD=206=E3=80=81=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=EF=BC=8C=E6=9B=B4=E6=8D=A2treetable=EF=BC=8C?= =?UTF-8?q?=E4=BA=8C=E5=BC=80=E6=9B=B4=E5=8A=A0=E5=8F=8B=E5=A5=BD=207?= =?UTF-8?q?=E3=80=81=E5=90=8E=E7=AB=AF=E4=BB=A3=E7=A0=81=E7=AE=80=E6=98=93?= =?UTF-8?q?=E4=BC=98=E5=8C=96(=E8=BF=91=E6=9C=9F=E4=BC=9A=E5=8A=A0?= =?UTF-8?q?=E6=B7=B1=E4=BC=98=E5=8C=96)=208=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E5=A4=84=E7=90=86js=20momentjs=20=E6=A0=A1?= =?UTF-8?q?=E9=AA=8Cjs=20validatorjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/lenos-oracle.sql | 2 +- db/lenos5.5-6.sql | 4 +- .../com/len/actlistener/ActNodeListener.java | 2 +- .../len/actlistener/ActStartNodeListener.java | 2 +- .../len/actlistener/LeaveListenerImpl.java | 2 +- .../com/len/actlistener/ListenUserRole.java | 2 +- .../com/len/config/ActPropertiesConfig.java | 2 +- .../len/controller/ActivitiController.java | 33 +- .../len/controller/UserLeaveController.java | 8 +- .../java/com/len/entity/ActDeployment.java | 2 +- .../main/java/com/len/entity/ActModel.java | 2 +- .../java/com/len/entity/LeaveOpinion.java | 2 +- .../com/len/entity/ProcessDefinition.java | 2 +- .../src/main/java/com/len/entity/Task.java | 2 +- .../com/len/service/ActAssigneeService.java | 2 +- .../com/len/service/UserLeaveService.java | 2 +- .../service/impl/ActAssigneeServiceImpl.java | 2 +- .../service/impl/UserLeaveServiceImpl.java | 2 +- .../main/java/com/len/util/AssigneeType.java | 2 +- .../org/activiti/rest/ActivitiService.java | 2 +- .../activiti/rest/model/ActivitiProcess.java | 2 +- .../resources/ftl/act/leave/add-leave.ftl | 2 +- .../resources/ftl/act/leave/leaveList.ftl | 4 +- .../ftl/act/leave/update-leave-readonly.ftl | 4 +- .../resources/ftl/act/leave/update-leave.ftl | 4 +- .../ftl/act/task/task-agent-iframe.ftl | 6 +- .../resources/ftl/act/task/task-agent.ftl | 6 +- .../main/resources/ftl/act/task/taskList.ftl | 6 +- .../src/main/resources/ftl/actList.ftl | 2 +- .../src/main/resources/ftl/actModelList.ftl | 2 +- .../properties/assignment-popup-popup.html | 22 +- .../properties/assignment-popup.html | 6 +- .../static/editor-app/css/style-common.css | 2 - .../resources/static/editor-app/plugins.xml | 2 +- .../src/test/java/com/len/JsonTest.java | 2 +- .../main/java/com/len/config/CorsConfig.java | 2 +- .../com/len/controller/ArticleController.java | 2 +- .../com/len/controller/AuthController.java | 2 +- .../len/controller/BlogAdminController.java | 2 +- .../controller/BlogCategoryController.java | 2 +- .../com/len/controller/TagController.java | 2 +- .../src/main/java/com/len/core/BlogRealm.java | 2 +- .../src/main/java/com/len/core/LenUser.java | 2 +- .../core/MyBasicHttpAuthenticationFilter.java | 2 +- .../len/core/exception/CustomException.java | 2 +- .../core/exception/UnauthorizedException.java | 2 +- .../java/com/len/entity/ArticleDetail.java | 2 +- .../main/java/com/len/entity/ArticleList.java | 2 +- .../java/com/len/model/SimpleArticle.java | 2 +- .../src/main/java/com/len/model/VArticle.java | 2 +- .../len/service/ArticleCategoryService.java | 2 +- .../com/len/service/ArticleTagService.java | 2 +- .../com/len/service/BlogArticleService.java | 2 +- .../com/len/service/BlogCategoryService.java | 2 +- .../java/com/len/service/BlogTagService.java | 2 +- .../impl/ArticleCategoryServiceImpl.java | 2 +- .../service/impl/ArticleTagServiceImpl.java | 2 +- .../service/impl/BlogArticleServiceImpl.java | 2 +- .../service/impl/BlogCategoryServiceImpl.java | 2 +- .../len/service/impl/BlogTagServiceImpl.java | 2 +- len-blog/src/test/java/com/len/BlogTest.java | 2 +- .../java/com/len/base/BaseController.java | 33 +- .../main/java/com/len/base/BaseMapper.java | 2 +- .../main/java/com/len/base/BaseService.java | 2 +- .../main/java/com/len/base/CurrentMenu.java | 126 +- .../main/java/com/len/base/CurrentRole.java | 74 +- .../len/base/impl/AbstractServiceImpl.java | 11 +- .../com/len/base/impl/BaseServiceImpl.java | 2 +- .../exception/CustomErrorViewResolver.java | 10 +- .../com/len/exception/CustomException.java | 48 - .../{MyException.java => LenException.java} | 6 +- .../com/len/exception/ServiceException.java | 26 + .../java/com/len/freemarker/LenInclude.java | 67 + .../len/freemarker/MyFreemarkerConfig.java | 23 - .../main/java/com/len/redis/RedisService.java | 2 +- .../com/len/util/ApplicationContextUtil.java | 2 +- .../src/main/java/com/len/util/BeanUtil.java | 2 +- .../src/main/java/com/len/util/Checkbox.java | 2 +- .../main/java/com/len/util/CommonUtil.java | 2 +- .../main/java/com/len/util/ContextUtil.java | 2 +- .../len/util/CustomUsernamePasswordToken.java | 2 +- .../src/main/java/com/len/util/IpUtil.java | 2 +- .../src/main/java/com/len/util/JsonUtil.java | 2 +- .../src/main/java/com/len/util/JwtToken.java | 2 +- .../main/java/com/len/util/LenResponse.java | 2 +- .../src/main/java/com/len/util/Md5Util.java | 2 +- .../src/main/java/com/len/util/PageUtil.java | 2 +- .../src/main/java/com/len/util/Principal.java | 2 +- .../src/main/java/com/len/util/ReType.java | 2 +- .../main/java/com/len/util/SpringUtil.java | 2 +- .../src/main/java/com/len/util/TreeUtil.java | 2 +- .../main/java/com/len/util/UploadUtil.java | 36 +- .../com/len/validator/ValidatorUtils.java | 8 +- .../com/len/controller/ErrorController.java | 2 +- .../com/len/controller/JobController.java | 6 +- .../com/len/controller/LogController.java | 14 +- .../com/len/controller/LoginController.java | 12 +- .../com/len/controller/MenuController.java | 229 +- .../com/len/controller/PersonController.java | 2 +- .../com/len/controller/RoleController.java | 6 +- .../com/len/controller/UserController.java | 50 +- .../java/com/len/core/annotation/Log.java | 2 +- .../com/len/core/annotation/LogAspect.java | 6 +- .../len/core/filter/CustomAdvicFilter.java | 2 +- .../com/len/core/filter/PermissionFilter.java | 2 +- .../len/core/filter/VerfityCodeFilter.java | 48 +- .../core/init/job/DataSourceJobThread.java | 2 +- .../CustomServletContextListener.java | 2 +- .../com/len/core/listener/LenospInit.java | 2 +- .../core/quartz/CustomQuartz/DataSchdule.java | 2 +- .../core/quartz/CustomQuartz/JobDemo1.java | 4 +- .../core/quartz/CustomQuartz/JobDemo2.java | 2 +- .../core/quartz/CustomQuartz/JobDemo3.java | 2 +- .../core/quartz/CustomQuartz/JobDemo4.java | 2 +- .../core/quartz/CustomQuartz/JobDemo5.java | 2 +- .../java/com/len/core/quartz/JobTask.java | 2 +- .../java/com/len/core/shiro/LoginRealm.java | 2 +- .../java/com/len/core/shiro/Principal.java | 2 +- .../src/main/java/com/len/entity/SysUser.java | 1 - .../main/java/com/len/service/JobService.java | 2 +- .../java/com/len/service/MenuService.java | 2 +- .../java/com/len/service/RoleMenuService.java | 2 +- .../java/com/len/service/RoleService.java | 2 +- .../java/com/len/service/RoleUserService.java | 2 +- .../java/com/len/service/SysUserService.java | 2 +- .../com/len/service/impl/JobServiceImpl.java | 6 +- .../com/len/service/impl/MenuServiceImpl.java | 418 +- .../len/service/impl/RoleMenuServiceImpl.java | 2 +- .../com/len/service/impl/RoleServiceImpl.java | 2 +- .../len/service/impl/RoleUserServiceImpl.java | 2 +- .../len/service/impl/SysUserServiceImpl.java | 6 +- len-sys/src/main/resources/ftl/login2.html | 133 +- .../main/resources/ftl/system/base/bar.ftl | 39 + .../main/resources/ftl/system/base/btn.ftl | 23 + .../main/resources/ftl/system/base/foot.ftl | 4 + .../resources/ftl/system/base/formBtn.ftl | 21 + .../resources/ftl/system/base/formHead.ftl | 14 + .../main/resources/ftl/system/base/head.ftl | 12 + .../main/resources/ftl/system/base/header.ftl | 41 - .../resources/ftl/system/base/queryBox.ftl | 15 + .../main/resources/ftl/system/base/searth.ftl | 14 + .../main/resources/ftl/system/base/upload.ftl | 54 + .../resources/ftl/system/depart/userList.ftl | 6 +- .../main/resources/ftl/system/job/add-job.ftl | 136 - .../src/main/resources/ftl/system/job/add.ftl | 104 + .../main/resources/ftl/system/job/jobList.ftl | 472 +- .../system/job/{update-job.ftl => update.ftl} | 54 +- .../main/resources/ftl/system/log/logList.ftl | 269 +- .../ftl/system/menu/{add-menu.ftl => add.ftl} | 39 +- .../resources/ftl/system/menu/menuList.ftl | 235 +- .../menu/{update-menu.ftl => update.ftl} | 23 +- .../main/resources/ftl/system/person/me.ftl | 17 +- .../resources/ftl/system/role/add-role.ftl | 133 - .../main/resources/ftl/system/role/add.ftl | 118 + .../resources/ftl/system/role/roleList.ftl | 351 +- .../resources/ftl/system/role/update-role.ftl | 165 - .../main/resources/ftl/system/role/update.ftl | 151 + .../ftl/system/user/{add-user.ftl => add.ftl} | 137 +- .../user/{re-pass.ftl => resetPassword.ftl} | 2 +- .../resources/ftl/system/user/update-user.ftl | 231 - .../main/resources/ftl/system/user/update.ftl | 199 + .../resources/ftl/system/user/userList.ftl | 308 +- .../src/main/resources/plugin/html/icon.html | 2 +- .../plugin/layui/modules/treeTable.js | 2265 ++++++++ .../plugin/layuitree/layui/css/layui.css | 2 - .../layuitree/layui/css/layui.mobile.css | 2 - .../layuitree/layui/css/modules/code.css | 2 - .../css/modules/laydate/default/laydate.css | 2 - .../layui/css/modules/laydate/icon.png | Bin 244 -> 0 bytes .../layui/css/modules/laydate/laydate.css | 1 - .../css/modules/layer/default/icon-ext.png | Bin 5911 -> 0 bytes .../layui/css/modules/layer/default/icon.png | Bin 11493 -> 0 bytes .../layui/css/modules/layer/default/layer.css | 2 - .../css/modules/layer/default/loading-0.gif | Bin 5793 -> 0 bytes .../css/modules/layer/default/loading-1.gif | Bin 701 -> 0 bytes .../css/modules/layer/default/loading-2.gif | Bin 1787 -> 0 bytes .../plugin/layuitree/layui/font/iconfont.eot | Bin 37712 -> 0 bytes .../plugin/layuitree/layui/font/iconfont.svg | 447 -- .../plugin/layuitree/layui/font/iconfont.ttf | Bin 37536 -> 0 bytes .../plugin/layuitree/layui/font/iconfont.woff | Bin 24684 -> 0 bytes .../plugin/layuitree/layui/images/face/0.gif | Bin 2689 -> 0 bytes .../plugin/layuitree/layui/images/face/1.gif | Bin 5514 -> 0 bytes .../plugin/layuitree/layui/images/face/10.gif | Bin 2797 -> 0 bytes .../plugin/layuitree/layui/images/face/11.gif | Bin 4121 -> 0 bytes .../plugin/layuitree/layui/images/face/12.gif | Bin 3361 -> 0 bytes .../plugin/layuitree/layui/images/face/13.gif | Bin 7425 -> 0 bytes .../plugin/layuitree/layui/images/face/14.gif | Bin 2375 -> 0 bytes .../plugin/layuitree/layui/images/face/15.gif | Bin 1793 -> 0 bytes .../plugin/layuitree/layui/images/face/16.gif | Bin 6721 -> 0 bytes .../plugin/layuitree/layui/images/face/17.gif | Bin 4439 -> 0 bytes .../plugin/layuitree/layui/images/face/18.gif | Bin 3017 -> 0 bytes .../plugin/layuitree/layui/images/face/19.gif | Bin 3040 -> 0 bytes .../plugin/layuitree/layui/images/face/2.gif | Bin 3222 -> 0 bytes .../plugin/layuitree/layui/images/face/20.gif | Bin 5144 -> 0 bytes .../plugin/layuitree/layui/images/face/21.gif | Bin 5191 -> 0 bytes .../plugin/layuitree/layui/images/face/22.gif | Bin 9823 -> 0 bytes .../plugin/layuitree/layui/images/face/23.gif | Bin 3792 -> 0 bytes .../plugin/layuitree/layui/images/face/24.gif | Bin 8096 -> 0 bytes .../plugin/layuitree/layui/images/face/25.gif | Bin 3127 -> 0 bytes .../plugin/layuitree/layui/images/face/26.gif | Bin 3291 -> 0 bytes .../plugin/layuitree/layui/images/face/27.gif | Bin 4377 -> 0 bytes .../plugin/layuitree/layui/images/face/28.gif | Bin 2793 -> 0 bytes .../plugin/layuitree/layui/images/face/29.gif | Bin 4854 -> 0 bytes .../plugin/layuitree/layui/images/face/3.gif | Bin 4017 -> 0 bytes .../plugin/layuitree/layui/images/face/30.gif | Bin 2555 -> 0 bytes .../plugin/layuitree/layui/images/face/31.gif | Bin 2002 -> 0 bytes .../plugin/layuitree/layui/images/face/32.gif | Bin 3481 -> 0 bytes .../plugin/layuitree/layui/images/face/33.gif | Bin 2454 -> 0 bytes .../plugin/layuitree/layui/images/face/34.gif | Bin 3700 -> 0 bytes .../plugin/layuitree/layui/images/face/35.gif | Bin 1800 -> 0 bytes .../plugin/layuitree/layui/images/face/36.gif | Bin 2331 -> 0 bytes .../plugin/layuitree/layui/images/face/37.gif | Bin 1513 -> 0 bytes .../plugin/layuitree/layui/images/face/38.gif | Bin 3615 -> 0 bytes .../plugin/layuitree/layui/images/face/39.gif | Bin 6495 -> 0 bytes .../plugin/layuitree/layui/images/face/4.gif | Bin 5689 -> 0 bytes .../plugin/layuitree/layui/images/face/40.gif | Bin 3154 -> 0 bytes .../plugin/layuitree/layui/images/face/41.gif | Bin 3644 -> 0 bytes .../plugin/layuitree/layui/images/face/42.gif | Bin 5305 -> 0 bytes .../plugin/layuitree/layui/images/face/43.gif | Bin 2674 -> 0 bytes .../plugin/layuitree/layui/images/face/44.gif | Bin 4126 -> 0 bytes .../plugin/layuitree/layui/images/face/45.gif | Bin 3417 -> 0 bytes .../plugin/layuitree/layui/images/face/46.gif | Bin 3007 -> 0 bytes .../plugin/layuitree/layui/images/face/47.gif | Bin 2333 -> 0 bytes .../plugin/layuitree/layui/images/face/48.gif | Bin 2689 -> 0 bytes .../plugin/layuitree/layui/images/face/49.gif | Bin 2315 -> 0 bytes .../plugin/layuitree/layui/images/face/5.gif | Bin 4567 -> 0 bytes .../plugin/layuitree/layui/images/face/50.gif | Bin 5866 -> 0 bytes .../plugin/layuitree/layui/images/face/51.gif | Bin 2785 -> 0 bytes .../plugin/layuitree/layui/images/face/52.gif | Bin 777 -> 0 bytes .../plugin/layuitree/layui/images/face/53.gif | Bin 2127 -> 0 bytes .../plugin/layuitree/layui/images/face/54.gif | Bin 2196 -> 0 bytes .../plugin/layuitree/layui/images/face/55.gif | Bin 1971 -> 0 bytes .../plugin/layuitree/layui/images/face/56.gif | Bin 2034 -> 0 bytes .../plugin/layuitree/layui/images/face/57.gif | Bin 2705 -> 0 bytes .../plugin/layuitree/layui/images/face/58.gif | Bin 2258 -> 0 bytes .../plugin/layuitree/layui/images/face/59.gif | Bin 10311 -> 0 bytes .../plugin/layuitree/layui/images/face/6.gif | Bin 2213 -> 0 bytes .../plugin/layuitree/layui/images/face/60.gif | Bin 3245 -> 0 bytes .../plugin/layuitree/layui/images/face/61.gif | Bin 2495 -> 0 bytes .../plugin/layuitree/layui/images/face/62.gif | Bin 2017 -> 0 bytes .../plugin/layuitree/layui/images/face/63.gif | Bin 5871 -> 0 bytes .../plugin/layuitree/layui/images/face/64.gif | Bin 6448 -> 0 bytes .../plugin/layuitree/layui/images/face/65.gif | Bin 3576 -> 0 bytes .../plugin/layuitree/layui/images/face/66.gif | Bin 3029 -> 0 bytes .../plugin/layuitree/layui/images/face/67.gif | Bin 2701 -> 0 bytes .../plugin/layuitree/layui/images/face/68.gif | Bin 1424 -> 0 bytes .../plugin/layuitree/layui/images/face/69.gif | Bin 2431 -> 0 bytes .../plugin/layuitree/layui/images/face/7.gif | Bin 3398 -> 0 bytes .../plugin/layuitree/layui/images/face/70.gif | Bin 4590 -> 0 bytes .../plugin/layuitree/layui/images/face/71.gif | Bin 5304 -> 0 bytes .../plugin/layuitree/layui/images/face/8.gif | Bin 4050 -> 0 bytes .../plugin/layuitree/layui/images/face/9.gif | Bin 4221 -> 0 bytes .../layuitree/layui/lay/modules/jquery.js | 5 - .../layuitree/layui/lay/modules/layer.js | 2 - .../layuitree/layui/lay/modules/laytpl.js | 2 - .../layuitree/layui/lay/modules/tree.js | 406 -- .../layuitree/layui/lay/modules/util.js | 2 - .../plugin/layuitree/layui/layui.all.js | 5 - .../resources/plugin/layuitree/layui/layui.js | 2 - .../src/main/resources/plugin/tools/main.js | 2 +- .../src/main/resources/plugin/tools/moment.js | 4602 +++++++++++++++++ .../src/main/resources/plugin/tools/tool.js | 482 +- .../plugin/validator/validator.min.js | 3 + .../src/main/java/com/len/LenApplication.java | 2 +- .../java/com/len/config/BeanFactoryImpl.java | 2 +- .../main/java/com/len/config/BeanName.java | 2 +- .../main/java/com/len/config/DruidConfig.java | 2 +- .../java/com/len/config/FreeMarkerConfig.java | 2 +- .../com/len/config/FreemarkerShiroConfig.java | 16 +- .../main/java/com/len/config/LogConfig.java | 2 +- .../config/MyModularRealmAuthenticator.java | 2 +- .../java/com/len/config/PageHelperConfig.java | 2 +- .../main/java/com/len/config/ShiroConfig.java | 7 +- .../java/com/len/config/SwaggerConfig.java | 4 +- .../com/len/config/TransactionalConfig.java | 2 +- .../java/com/len/config/WebMvcConfig.java | 2 +- .../java/com/len/config/ZBeanFactory.java | 2 +- len-web/src/main/java/test/ActivitiDemo.java | 2 +- .../src/main/java/test/ActivitiGateWay.java | 2 +- .../src/main/java/test/ActivitiVariable.java | 2 +- len-web/src/main/java/test/BlogTest.java | 2 +- len-web/src/main/java/test/BootTest.java | 2 +- len-web/src/main/java/test/MybatisApp.java | 2 +- pom.xml | 5 + 284 files changed, 9515 insertions(+), 3876 deletions(-) delete mode 100644 len-core/src/main/java/com/len/exception/CustomException.java rename len-core/src/main/java/com/len/exception/{MyException.java => LenException.java} (70%) create mode 100644 len-core/src/main/java/com/len/exception/ServiceException.java create mode 100644 len-core/src/main/java/com/len/freemarker/LenInclude.java delete mode 100644 len-core/src/main/java/com/len/freemarker/MyFreemarkerConfig.java create mode 100644 len-sys/src/main/resources/ftl/system/base/bar.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/btn.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/foot.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/formBtn.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/formHead.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/head.ftl delete mode 100644 len-sys/src/main/resources/ftl/system/base/header.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/queryBox.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/searth.ftl create mode 100644 len-sys/src/main/resources/ftl/system/base/upload.ftl delete mode 100644 len-sys/src/main/resources/ftl/system/job/add-job.ftl create mode 100644 len-sys/src/main/resources/ftl/system/job/add.ftl rename len-sys/src/main/resources/ftl/system/job/{update-job.ftl => update.ftl} (64%) rename len-sys/src/main/resources/ftl/system/menu/{add-menu.ftl => add.ftl} (86%) rename len-sys/src/main/resources/ftl/system/menu/{update-menu.ftl => update.ftl} (92%) delete mode 100644 len-sys/src/main/resources/ftl/system/role/add-role.ftl create mode 100644 len-sys/src/main/resources/ftl/system/role/add.ftl delete mode 100644 len-sys/src/main/resources/ftl/system/role/update-role.ftl create mode 100644 len-sys/src/main/resources/ftl/system/role/update.ftl rename len-sys/src/main/resources/ftl/system/user/{add-user.ftl => add.ftl} (65%) rename len-sys/src/main/resources/ftl/system/user/{re-pass.ftl => resetPassword.ftl} (98%) delete mode 100644 len-sys/src/main/resources/ftl/system/user/update-user.ftl create mode 100644 len-sys/src/main/resources/ftl/system/user/update.ftl create mode 100644 len-sys/src/main/resources/plugin/layui/modules/treeTable.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/layui.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/layui.mobile.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/code.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/laydate/default/laydate.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/laydate/icon.png delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/laydate/laydate.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/icon-ext.png delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/icon.png delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/layer.css delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/loading-0.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/loading-1.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/css/modules/layer/default/loading-2.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/font/iconfont.eot delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/font/iconfont.svg delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/font/iconfont.ttf delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/font/iconfont.woff delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/0.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/1.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/10.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/11.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/12.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/13.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/14.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/15.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/16.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/17.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/18.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/19.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/2.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/20.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/21.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/22.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/23.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/24.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/25.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/26.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/27.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/28.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/29.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/3.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/30.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/31.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/32.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/33.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/34.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/35.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/36.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/37.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/38.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/39.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/4.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/40.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/41.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/42.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/43.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/44.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/45.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/46.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/47.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/48.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/49.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/5.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/50.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/51.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/52.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/53.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/54.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/55.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/56.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/57.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/58.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/59.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/6.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/60.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/61.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/62.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/63.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/64.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/65.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/66.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/67.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/68.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/69.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/7.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/70.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/71.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/8.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/images/face/9.gif delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/jquery.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/layer.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/laytpl.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/tree.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/lay/modules/util.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/layui.all.js delete mode 100644 len-sys/src/main/resources/plugin/layuitree/layui/layui.js create mode 100644 len-sys/src/main/resources/plugin/tools/moment.js create mode 100644 len-sys/src/main/resources/plugin/validator/validator.min.js diff --git a/db/lenos-oracle.sql b/db/lenos-oracle.sql index 47237e6..3dd20bf 100644 --- a/db/lenos-oracle.sql +++ b/db/lenos-oracle.sql @@ -1235,7 +1235,7 @@ COMMENT ON COLUMN "LEN"."SYS_USER"."DEL_FLAG" IS '0可用1封禁'; -- Records of SYS_USER -- ---------------------------- INSERT INTO "LEN"."SYS_USER" VALUES ('1ec421975ffe45229b48d4b9d712ff4f', '33333', '533add1dc96c02469d50ca0ffdcb493a', '26', null, null, '33', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-08-20 23:52:47', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-12-11 22:57:16', 'YYYY-MM-DD HH24:MI:SS'), '0'); -INSERT INTO "LEN"."SYS_USER" VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', '154040976@qq.com', 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 15:49:48', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-19 21:15:49', 'YYYY-MM-DD HH24:MI:SS'), '0'); +INSERT INTO "LEN"."SYS_USER" VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', 'lenospmiller@gmail.com', 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-03 15:49:48', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-06-19 21:15:49', 'YYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO "LEN"."SYS_USER" VALUES ('2bf2d2db774247b99f27efb1dda29c34', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); INSERT INTO "LEN"."SYS_USER" VALUES ('3c14c2f8316741e9aaeb29d78d03e958', '22222', '2b8aae82f069cc838dfe8afc945f8045', '222', null, null, '222', 'acfc0e9232f54732a5d9ffe9071bf572', null, TO_DATE('2018-08-19 22:00:27', 'YYYY-MM-DD HH24:MI:SS'), null, '0'); INSERT INTO "LEN"."SYS_USER" VALUES ('a4a743bffe9711e7b472201a068c6482', 'zxm', 'f8880ebbdbc37a936245657fa9084198', '25', '1544040976@qq.com', '662d5a3b-56aa-4bbb-bd47-194e24db1d60.jpeg', 'zxm', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', TO_DATE('2018-01-21 18:41:32', 'YYYY-MM-DD HH24:MI:SS'), TO_DATE('2019-02-17 15:09:41', 'YYYY-MM-DD HH24:MI:SS'), '0'); diff --git a/db/lenos5.5-6.sql b/db/lenos5.5-6.sql index 9ef62e0..a2dc28e 100644 --- a/db/lenos5.5-6.sql +++ b/db/lenos5.5-6.sql @@ -453,7 +453,7 @@ CREATE TABLE `act_id_user` ( -- Records of act_id_user -- ---------------------------- INSERT INTO `act_id_user` VALUES ('1ec421975ffe45229b48d4b9d712ff4f', '1', '33', null, '', null, null); -INSERT INTO `act_id_user` VALUES ('2211fec3e17c11e795ed201a068c6482', '1', 'Tom Curise', null, '154040976@qq.com', null, null); +INSERT INTO `act_id_user` VALUES ('2211fec3e17c11e795ed201a068c6482', '1', 'Tom Curise', null, 'lenospmiller@gmail.com', null, null); INSERT INTO `act_id_user` VALUES ('3c14c2f8316741e9aaeb29d78d03e958', '1', '222', null, '', null, null); INSERT INTO `act_id_user` VALUES ('a4a743bffe9711e7b472201a068c6482', '1', 'zxm', null, '1544040976@qq.com', null, null); INSERT INTO `act_id_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '1', '管理员', null, '', null, null); @@ -1224,7 +1224,7 @@ CREATE TABLE `sys_user` ( -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('1ec421975ffe45229b48d4b9d712ff4f', '33333', '533add1dc96c02469d50ca0ffdcb493a', '26', null, null, '33', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-08-20 23:52:47', '2018-12-11 22:57:16', '0'); -INSERT INTO `sys_user` VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', '154040976@qq.com', 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 15:49:48', '2018-06-19 21:15:49', '0'); +INSERT INTO `sys_user` VALUES ('2211fec3e17c11e795ed201a068c6482', 'tom', '11ac200620f90acd1fdae53716fd3de2', '41', 'lenospmiller@gmail.com', 'bd214483-7c5e-49d6-862d-de97e9de50b5.jpeg', 'Tom Curise', null, 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-03 15:49:48', '2018-06-19 21:15:49', '0'); INSERT INTO `sys_user` VALUES ('2bf2d2db774247b99f27efb1dda29c34', '12', '123456', '10', '2345', null, '123', null, null, null, null, '0'); INSERT INTO `sys_user` VALUES ('3c14c2f8316741e9aaeb29d78d03e958', '22222', '2b8aae82f069cc838dfe8afc945f8045', '222', null, null, '222', 'acfc0e9232f54732a5d9ffe9071bf572', null, '2018-08-19 22:00:27', null, '0'); INSERT INTO `sys_user` VALUES ('a4a743bffe9711e7b472201a068c6482', 'zxm', 'f8880ebbdbc37a936245657fa9084198', '25', '1544040976@qq.com', '662d5a3b-56aa-4bbb-bd47-194e24db1d60.jpeg', 'zxm', 'acfc0e9232f54732a5d9ffe9071bf572', 'acfc0e9232f54732a5d9ffe9071bf572', '2018-01-21 18:41:32', '2018-11-25 15:00:41', '0'); diff --git a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java index 673daa6..155ca87 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java @@ -30,7 +30,7 @@ import org.activiti.engine.delegate.TaskListener; /** * @author zhuxiaomeng * @date 2018/1/20. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 流程监听器 动态注入节点办理人 */ diff --git a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java index 3f42e7d..ab993a0 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java +++ b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java @@ -24,7 +24,7 @@ import java.util.Map; /** * @author zhuxiaomeng * @date 2018/1/20. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 流程监听器 动态注入节点办理人 */ diff --git a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java index 4d008ff..ebac5f5 100644 --- a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java +++ b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java @@ -23,7 +23,7 @@ import java.util.Map; /** * @author zhuxiaomeng * @date 2018/1/25. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 自定义请假流程 监听器 */ diff --git a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java index 59f771d..f1de9c2 100644 --- a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java +++ b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java @@ -38,7 +38,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/25. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 切入实现系统用户 角色 用户-角色 同步到 activiti 用户 组 用户组 同步到工作流,模块化 无侵入 */ diff --git a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java index 8e4fe0b..960e5ab 100644 --- a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java +++ b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java @@ -23,7 +23,7 @@ import org.springframework.context.annotation.PropertySource; /** * @author zhuxiaomeng * @date 2018/1/28. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * * 可以自定义一些配置类 */ diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java index 91e43c5..b8cd4c5 100644 --- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java +++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.len.base.BaseController; import com.len.config.ActPropertiesConfig; import com.len.entity.*; -import com.len.exception.MyException; +import com.len.exception.LenException; import com.len.service.ActAssigneeService; import com.len.service.RoleService; import com.len.service.RoleUserService; @@ -39,7 +39,6 @@ import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.IdentityService; import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; import org.activiti.engine.identity.Group; import org.activiti.engine.identity.User; import org.activiti.engine.impl.persistence.entity.GroupEntity; @@ -58,16 +57,16 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.*; /** * @author zhuxiaomeng * @date 2018/1/13. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 流程管理 流程创建、发布 流程节点绑定角色/用户(绑定用户 开始ing) */ @@ -81,9 +80,6 @@ public class ActivitiController extends BaseController { @Autowired private ObjectMapper objectMapper; - @Autowired - private RuntimeService runtimeService; - @Autowired private IdentityService identityService; @@ -137,7 +133,7 @@ public class ActivitiController extends BaseController { identityService.createMembership(sysRoleUser.getUserId(), sysRoleUser.getRoleId()); } j.setMsg("同步成功"); - } catch (MyException e) { + } catch (LenException e) { j.setFlag(false); j.setMsg("同步失败"); e.printStackTrace(); @@ -170,14 +166,13 @@ public class ActivitiController extends BaseController { String id = model.getId(); //完善ModelEditorSource - ObjectNode editorNode = objectMapper.createObjectNode(); - editorNode.put("id", "canvas"); - editorNode.put("resourceId", "canvas"); - ObjectNode stencilSetNode = objectMapper.createObjectNode(); - stencilSetNode.put("namespace", - "http://b3mn.org/stencilset/bpmn2.0#"); - editorNode.put("stencilset", stencilSetNode); - repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8")); + JSONObject editor = new JSONObject(); + editor.put("id", "canvas"); + editor.put("resourceId", "canvas"); + JSONObject stencil = new JSONObject(); + stencil.put("namespace", "http://lenosp.cn#"); + editor.put("stencilset", stencil); + repositoryService.addModelEditorSource(id, editor.toString().getBytes(StandardCharsets.UTF_8)); return "redirect:/static/modeler.html?modelId=" + id; } @@ -282,7 +277,7 @@ public class ActivitiController extends BaseController { .deploy(); modelData.setDeploymentId(deployment.getId()); repositoryService.saveModel(modelData); - } catch (MyException e) { + } catch (LenException e) { msg = "发布数失败"; j.setFlag(false); } catch (IOException e) { @@ -403,7 +398,7 @@ public class ActivitiController extends BaseController { } repositoryService.deleteDeployment(id, true); j.setMsg("删除成功"); - } catch (MyException e) { + } catch (LenException e) { j.setMsg("删除失败"); j.setFlag(false); e.printStackTrace(); @@ -462,7 +457,7 @@ public class ActivitiController extends BaseController { try { repositoryService.deleteModel(id); j.setMsg("删除成功"); - } catch (MyException e) { + } catch (LenException e) { j.setMsg("删除失败"); j.setFlag(false); e.printStackTrace(); diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java index 6c048cf..25a92cd 100644 --- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java +++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java @@ -28,7 +28,7 @@ import com.len.entity.BaseTask; import com.len.entity.LeaveOpinion; import com.len.entity.SysRoleUser; import com.len.entity.UserLeave; -import com.len.exception.MyException; +import com.len.exception.LenException; import com.len.service.RoleUserService; import com.len.service.UserLeaveService; import com.len.util.*; @@ -67,7 +67,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/21. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com *

        * 请假流程示例 */ @@ -136,7 +136,7 @@ public class UserLeaveController extends BaseController { leave.setTaskName(task.getName()); } } - } catch (MyException e) { + } catch (LenException e) { e.printStackTrace(); } return new ReType(tPage.getTotal(), tList); @@ -214,7 +214,7 @@ public class UserLeaveController extends BaseController { } taskService.complete(taskId, map); j.setMsg("保存成功"); - } catch (MyException e) { + } catch (LenException e) { j.setMsg("保存失败"); j.setFlag(false); e.printStackTrace(); diff --git a/len-activiti/src/main/java/com/len/entity/ActDeployment.java b/len-activiti/src/main/java/com/len/entity/ActDeployment.java index 72159c4..39df8d3 100644 --- a/len-activiti/src/main/java/com/len/entity/ActDeployment.java +++ b/len-activiti/src/main/java/com/len/entity/ActDeployment.java @@ -24,7 +24,7 @@ import org.activiti.engine.repository.Deployment; /** * @author zhuxiaomeng * @date 2018/1/15. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * 流程部署表 */ @Getter diff --git a/len-activiti/src/main/java/com/len/entity/ActModel.java b/len-activiti/src/main/java/com/len/entity/ActModel.java index 4d78554..479b4c5 100644 --- a/len-activiti/src/main/java/com/len/entity/ActModel.java +++ b/len-activiti/src/main/java/com/len/entity/ActModel.java @@ -26,7 +26,7 @@ import org.activiti.engine.repository.Model; /** * @author zhuxiaomeng * @date 2018/1/18. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * 模型列表 */ @Data diff --git a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java index 1e1f03c..091f837 100644 --- a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java +++ b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java @@ -23,7 +23,7 @@ import lombok.Setter; /** * @author zhuxiaomeng * @date 2018/1/26. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * * 请假流程 审批信息 */ diff --git a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java index ba39f20..00cdec5 100644 --- a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java +++ b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java @@ -22,7 +22,7 @@ import lombok.ToString; /** * @author zhuxiaomeng * @date 2018/1/21. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * 流程定义实体 */ @Getter diff --git a/len-activiti/src/main/java/com/len/entity/Task.java b/len-activiti/src/main/java/com/len/entity/Task.java index 1939a17..4bea8f9 100644 --- a/len-activiti/src/main/java/com/len/entity/Task.java +++ b/len-activiti/src/main/java/com/len/entity/Task.java @@ -23,7 +23,7 @@ import lombok.ToString; /** * @author zhuxiaomeng * @date 2018/1/21. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * * 流程任务 */ diff --git a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java index e289669..ad2c565 100644 --- a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java +++ b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java @@ -9,7 +9,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/23. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ public interface ActAssigneeService extends BaseService { int deleteByNodeId(String nodeId); diff --git a/len-activiti/src/main/java/com/len/service/UserLeaveService.java b/len-activiti/src/main/java/com/len/service/UserLeaveService.java index 4e586ad..ee490c7 100644 --- a/len-activiti/src/main/java/com/len/service/UserLeaveService.java +++ b/len-activiti/src/main/java/com/len/service/UserLeaveService.java @@ -8,7 +8,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/21. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ public interface UserLeaveService extends BaseService { diff --git a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java index f230173..a0b6dfc 100644 --- a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java @@ -21,7 +21,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/23. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ @Service public class ActAssigneeServiceImpl extends BaseServiceImpl implements diff --git a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java index 6bb2376..bb21eaa 100644 --- a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java +++ b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java @@ -12,7 +12,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2018/1/21. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ @Service public class UserLeaveServiceImpl extends BaseServiceImpl implements diff --git a/len-activiti/src/main/java/com/len/util/AssigneeType.java b/len-activiti/src/main/java/com/len/util/AssigneeType.java index fa30225..4c25070 100644 --- a/len-activiti/src/main/java/com/len/util/AssigneeType.java +++ b/len-activiti/src/main/java/com/len/util/AssigneeType.java @@ -3,7 +3,7 @@ package com.len.util; /** * @author zhuxiaomeng * @date 2018/1/24. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com * * 工作流节点绑定类型 */ diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java index f18ea1a..2c9cab0 100644 --- a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java +++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; /** * @author zhuxiaomeng * @date 2019-03-10. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ @Service public class ActivitiService { diff --git a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java index 3587148..a239d0c 100644 --- a/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java +++ b/len-activiti/src/main/java/org/activiti/rest/model/ActivitiProcess.java @@ -9,7 +9,7 @@ import java.util.List; /** * @author zhuxiaomeng * @date 2019-03-10. - * @email 154040976@qq.com + * @email lenospmiller@gmail.com */ @Data @ApiModel("流程顺序") diff --git a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl index 703bd1c..dd70421 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/add-leave.ftl @@ -144,7 +144,7 @@ To change this template use File | Settings | File Templates.--> }) //监听提交 form.on('submit(add)', function (data) { - layerAjax('addLeave', data.field, 'leaveList'); + Len.layerAjax('addLeave', data.field, 'leaveList'); return false; }); }); diff --git a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl index 57d5d61..5bba6ba 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/leaveList.ftl @@ -9,7 +9,7 @@ 请假流程示例 -<#include "/system/base/header.ftl"> +<#include "/system/base/head.ftl"> @@ -199,7 +199,7 @@ }); } }); - eleClick(active, '.len-form-item .layui-btn,.layui-col-md12 .layui-btn'); + Len.eleClick(active, '.len-form-item .layui-btn,.layui-col-md12 .layui-btn'); }); function add(title, url, w, h) { diff --git a/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl b/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl index a544e77..0967821 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/update-leave-readonly.ftl @@ -130,10 +130,10 @@ To change this template use File | Settings | File Templates.--> }) //监听提交 form.on('submit(add)', function(data){ - layerAjax('updateLeave/${taskId}/${leave.id}/true',data.field,'taskList'); + Len.layerAjax('updateLeave/${taskId}/${leave.id}/true',data.field,'taskList'); return false; }); form.on('submit(closeLeave)', function(data){ - layerAjax('updateLeave/${taskId}/${leave.id}/false',data.field,'taskList'); + Len.layerAjax('updateLeave/${taskId}/${leave.id}/false',data.field,'taskList'); return false; }); }); diff --git a/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl b/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl index f8264f3..0b865a0 100644 --- a/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl +++ b/len-activiti/src/main/resources/ftl/act/leave/update-leave.ftl @@ -144,10 +144,10 @@ To change this template use File | Settings | File Templates.--> }) //监听提交 form.on('submit(add)', function(data){ - layerAjax('updateLeave/${taskId}/${leave.id}/true',data.field,'taskList'); + Len.layerAjax('updateLeave/${taskId}/${leave.id}/true',data.field,'taskList'); return false; }); form.on('submit(closeLeave)', function(data){ - layerAjax('updateLeave/${taskId}/${leave.id}/false',data.field,'taskList'); + Len.layerAjax('updateLeave/${taskId}/${leave.id}/false',data.field,'taskList'); return false; }); }); diff --git a/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl b/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl index fbcc287..46a673d 100644 --- a/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/task-agent-iframe.ftl @@ -74,17 +74,17 @@ To change this template use File | Settings | File Templates.--> parent.layer.close(index); } } - eleClick(active,'.layui-form-item .layui-btn'); + Len.eleClick(active,'.layui-form-item .layui-btn'); form.on('submit(no)',function(data){ data.field.flag=false; - layerAjax('complete',data.field,'taskList'); + Len.layerAjax('complete',data.field,'taskList'); return false; }); form.on('submit(ok)', function(data){ data.field.flag=true; - layerAjax('complete',data.field,'taskList'); + Len.layerAjax('complete',data.field,'taskList'); return false; }); form.render(); diff --git a/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl b/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl index 501e0f7..0b8168b 100644 --- a/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/task-agent.ftl @@ -98,17 +98,17 @@ To change this template use File | Settings | File Templates.--> parent.layer.close(index); } } - eleClick(active,'.layui-form-item .layui-btn'); + Len.eleClick(active,'.layui-form-item .layui-btn'); form.on('submit(no)',function(data){ data.field.flag=false; - layerAjax('complete',data.field,'taskList'); + Len.layerAjax('complete',data.field,'taskList'); return false; }); form.on('submit(ok)', function(data){ data.field.flag=true; - layerAjax('complete',data.field,'taskList'); + Len.layerAjax('complete',data.field,'taskList'); return false; }); form.render(); diff --git a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl index cbbaf54..32d4975 100644 --- a/len-activiti/src/main/resources/ftl/act/task/taskList.ftl +++ b/len-activiti/src/main/resources/ftl/act/task/taskList.ftl @@ -9,7 +9,7 @@ 我的任务 -<#include "/system/base/header.ftl"> +<#include "/system/base/head.ftl"> @@ -151,9 +151,9 @@ table.on('tool(task)', function (obj) { var data = obj.data; if (obj.event === 'handle') { - popup('办理','/leave/agent/'+data.id,700,500,'task-agent'); + Len.popup('办理','/leave/agent/'+data.id,700,500,'task-agent'); }else if(obj.event === 'update'){ - popup('编辑','${re.contextPath}/leave/updateLeave/'+data.id,700,500,'task-update'); + Len.popup('编辑','${re.contextPath}/leave/updateLeave/'+data.id,700,500,'task-update'); }else if(obj.event==='leaveDetail'){ window.top.layer.open({ id: 'leave-detail', diff --git a/len-activiti/src/main/resources/ftl/actList.ftl b/len-activiti/src/main/resources/ftl/actList.ftl index 2489d89..1bf418c 100644 --- a/len-activiti/src/main/resources/ftl/actList.ftl +++ b/len-activiti/src/main/resources/ftl/actList.ftl @@ -9,7 +9,7 @@ 流程部署 -<#include "/system/base/header.ftl"> +<#include "/system/base/head.ftl"> diff --git a/len-activiti/src/main/resources/ftl/actModelList.ftl b/len-activiti/src/main/resources/ftl/actModelList.ftl index 1bea7eb..d318b60 100644 --- a/len-activiti/src/main/resources/ftl/actModelList.ftl +++ b/len-activiti/src/main/resources/ftl/actModelList.ftl @@ -9,7 +9,7 @@ 模型列表 -<#include "/system/base/header.ftl"> +<#include "/system/base/head.ftl"> diff --git a/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html b/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html index b405a44..baf8242 100644 --- a/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html +++ b/len-activiti/src/main/resources/static/editor-app/configuration/properties/assignment-popup-popup.html @@ -8,22 +8,19 @@