From c235d134e33759833e428d463c02c83e0a97bad6 Mon Sep 17 00:00:00 2001 From: zhuyuping Date: Tue, 10 Apr 2018 21:16:00 +0800 Subject: [PATCH 1/9] fix --- .../java/com/beautiful/api/row/DataRow.java | 5 +- .../com/beautiful/data/vec/DataFrame.scala | 66 ++++++++++++++----- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/beautiful-api/src/main/java/com/beautiful/api/row/DataRow.java b/beautiful-api/src/main/java/com/beautiful/api/row/DataRow.java index 076a99c..afb30fe 100644 --- a/beautiful-api/src/main/java/com/beautiful/api/row/DataRow.java +++ b/beautiful-api/src/main/java/com/beautiful/api/row/DataRow.java @@ -1,6 +1,7 @@ package com.beautiful.api.row; import com.beautiful.api.column.DataColumn; +import com.beautiful.api.writable.WritableValue; import java.io.Serializable; @@ -13,9 +14,9 @@ public interface DataRow extends Serializable { DataColumn[] getColumns(); - Object get(int index); + WritableValue get(int index); - Object get(String name); + WritableValue get(String name); } diff --git a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala index 8d642ed..90655ca 100644 --- a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala +++ b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala @@ -6,6 +6,8 @@ import com.beautiful.api.column.DataColumn import com.beautiful.api.index.Index import com.beautiful.api.ops._ import com.beautiful.api.row.DataRow +import com.beautiful.api.writable.WritableValue +import com.beautiful.api.writable.Writables.WritableValueLike import shapeless.T @@ -16,7 +18,49 @@ import shapeless.T * @CreateDate: 2018/4/9 13:21 * **/ -trait DataFrame extends Iterable[DataRow] { +trait DataFrame { + + def toList: Seq[Seq[WritableValue]] + + def add(column: DataColumn, values: Seq[WritableValue]) + + def add(rows: Seq[DataRow]): DataFrame + + def drop: DataFrame + + def rename + + def reshape(rows: Int, cols: Int) + + def transpose: DataFrame + + def retain: DataFrame + + def reindex: DataFrame + + def merge: DataFrame + + def join: DataFrame + + def update: DataFrame + + def size: Int = getColumns.length + + def isEmpty: Boolean = length == 0 + + def length: Int = toList.length + + def fillna[T: WritableValueLike](v: T) + + def dropna: DataFrame + + def downsample: DataFrame + + def oversample: DataFrame + + def conversion: DataFrame + + def semiSupervised: DataFrame def getIndex: Index @@ -40,11 +84,13 @@ trait DataFrame extends Iterable[DataRow] { def to(export: Exporter): DataFrame - def toList: Seq[Seq[AnyVal]] + def get(row: Int, col: Int): WritableValue + + def slice(rowStart: Int, rowEnd: Int) - def toList[T](clazz: Class[T]): Seq[T] + def vizPlot(xColumn: Int, yColumn: Int): Unit - def toMap[K, V](keyClazz: Class[K], valueClazz: Class[K]): Seq[Map[K, V]] + def vizCount(xColumn: Int, yColumn: Int): Unit def print(): Unit @@ -54,18 +100,6 @@ trait DataFrame extends Iterable[DataRow] { abstract class BasicDataFrame(var index: Index, var columns: Seq[DataColumn], var datas: DataBlock[T]) extends DataFrame { - this () = { - this (new Index, Seq.empty, new DataBlock); - } - - this (index: Index, columns: Seq[DataColumn]) = { - this (index, columns, new DataBlock); - } - - override def from(loader: Loader): DataFrame = { - loader.addListener() - - } } From dc419541dc1a2fff2cce0ed6d1125d23e0c97c97 Mon Sep 17 00:00:00 2001 From: zhuyuping Date: Mon, 16 Apr 2018 23:44:26 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=8F=90=E5=8F=96joury=20=E5=BA=93=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=9C=80=E5=A4=96=E5=B1=82=E7=9A=84=E5=8C=85?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/ms/sequence/Sequence.java | 176 ++++++++++++++++++ .../main/java/cn/ms/sequence/SystemClock.java | 69 +++++++ .../com/beautiful/api/block/DataBlock.java | 52 +++--- .../java/com/beautiful/api/index/Index.java | 94 ---------- ...ggregateReducer.scala => Aggregater.scala} | 2 +- .../scala/com/beautiful/api/ops/Loader.scala | 5 +- beautiful-data/beautiful-data-vec/pom.xml | 5 + .../data/vec/facade/DataFramesFacade.java | 7 - .../src/main/java/com/beautiful/package.scala | 13 -- .../com/beautiful/data/vec/DataFrame.scala | 105 ----------- .../data/vec/PreProcessBuilder.scala | 6 +- 11 files changed, 282 insertions(+), 252 deletions(-) create mode 100644 beautiful-api/src/main/java/cn/ms/sequence/Sequence.java create mode 100644 beautiful-api/src/main/java/cn/ms/sequence/SystemClock.java delete mode 100644 beautiful-api/src/main/java/com/beautiful/api/index/Index.java rename beautiful-api/src/main/scala/com/beautiful/api/ops/{AggregateReducer.scala => Aggregater.scala} (78%) delete mode 100644 beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/package.scala delete mode 100644 beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala diff --git a/beautiful-api/src/main/java/cn/ms/sequence/Sequence.java b/beautiful-api/src/main/java/cn/ms/sequence/Sequence.java new file mode 100644 index 0000000..24728fe --- /dev/null +++ b/beautiful-api/src/main/java/cn/ms/sequence/Sequence.java @@ -0,0 +1,176 @@ +package cn.ms.sequence; + + +/** + * 基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(sequence) + *

+ *
+ * SnowFlake的结构如下(每部分用-分开):
+ *
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ *
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
+ *
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) + * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
+ *
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
+ *
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
+ *
+ *
+ * 加起来刚好64位,为一个Long型。
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 + * + * @author lry + */ +public class Sequence { + + + /** + * 起始时间戳,用于用当前时间戳减去这个时间戳,算出偏移量 + **/ + private final long startTime = 1519740777809L; + + /** + * workerId占用的位数5(表示只允许workId的范围为:0-1023) + **/ + private final long workerIdBits = 5L; + /** + * dataCenterId占用的位数:5 + **/ + private final long dataCenterIdBits = 5L; + /** + * 序列号占用的位数:12(表示只允许workId的范围为:0-4095) + **/ + private final long sequenceBits = 12L; + + /** + * workerId可以使用的最大数值:31 + **/ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + /** + * dataCenterId可以使用的最大数值:31 + **/ + private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits); + + private final long workerIdShift = sequenceBits; + private final long dataCenterIdShift = sequenceBits + workerIdBits; + private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; + + /** + * 用mask防止溢出:位与运算保证计算的结果范围始终是 0-4095 + **/ + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + + private long workerId; + private long dataCenterId; + private long sequence = 0L; + private long lastTimestamp = -1L; + private boolean isClock = false; + + /** + * 基于Snowflake创建分布式ID生成器 + *

+ * 注:sequence + * + * @param workerId 工作机器ID,数据范围为0~31 + * @param dataCenterId 数据中心ID,数据范围为0~31 + */ + public Sequence(long workerId, long dataCenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (dataCenterId > maxDataCenterId || dataCenterId < 0) { + throw new IllegalArgumentException(String.format("dataCenter Id can't be greater than %d or less than 0", maxDataCenterId)); + } + + this.workerId = workerId; + this.dataCenterId = dataCenterId; + } + + public void setClock(boolean clock) { + isClock = clock; + } + + /** + * 获取ID + * + * @return + */ + public synchronized Long nextId() { + long timestamp = this.timeGen(); + + // 闰秒:如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + long offset = lastTimestamp - timestamp; + if (offset <= 5) { + try { + this.wait(offset << 1); + timestamp = this.timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", offset)); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } else { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", offset)); + } + } + + // 解决跨毫秒生成ID序列号始终为偶数的缺陷:如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + // 通过位与运算保证计算的结果范围始终是 0-4095 + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = this.tilNextMillis(lastTimestamp); + } + } else { + // 时间戳改变,毫秒内序列重置 + sequence = 0L; + } + + lastTimestamp = timestamp; + + /* + * 1.左移运算是为了将数值移动到对应的段(41、5、5,12那段因为本来就在最右,因此不用左移) + * 2.然后对每个左移后的值(la、lb、lc、sequence)做位或运算,是为了把各个短的数据合并起来,合并成一个二进制数 + * 3.最后转换成10进制,就是最终生成的id + */ + return ((timestamp - startTime) << timestampLeftShift) | + (dataCenterId << dataCenterIdShift) | + (workerId << workerIdShift) | + sequence; + } + + /** + * 保证返回的毫秒数在参数之后(阻塞到下一个毫秒,直到获得新的时间戳) + * + * @param lastTimestamp + * @return + */ + private long tilNextMillis(long lastTimestamp) { + long timestamp = this.timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = this.timeGen(); + } + + return timestamp; + } + + /** + * 获得系统当前毫秒数 + * + * @return timestamp + */ + private long timeGen() { + if (isClock) { + // 解决高并发下获取时间戳的性能问题 + return SystemClock.now(); + } else { + return System.currentTimeMillis(); + } + } + +} \ No newline at end of file diff --git a/beautiful-api/src/main/java/cn/ms/sequence/SystemClock.java b/beautiful-api/src/main/java/cn/ms/sequence/SystemClock.java new file mode 100644 index 0000000..f3f6dc1 --- /dev/null +++ b/beautiful-api/src/main/java/cn/ms/sequence/SystemClock.java @@ -0,0 +1,69 @@ +package cn.ms.sequence; + +import java.sql.Timestamp; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +/** + * 高并发场景下System.currentTimeMillis()的性能问题的优化 + *

+ * System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100倍左右)

+ * System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道

+ * 后台定时更新时钟,JVM退出时,线程自动回收

+ * 10亿:43410,206,210.72815533980582%

+ * 1亿:4699,29,162.0344827586207%

+ * 1000万:480,12,40.0%

+ * 100万:50,10,5.0%

+ * + * @author lry + */ +public class SystemClock { + + private final long period; + private final AtomicLong now; + + private SystemClock(long period) { + this.period = period; + this.now = new AtomicLong(System.currentTimeMillis()); + scheduleClockUpdating(); + } + + private static SystemClock instance() { + return InstanceHolder.INSTANCE; + } + + public static long now() { + return instance().currentTimeMillis(); + } + + public static String nowDate() { + return new Timestamp(instance().currentTimeMillis()).toString(); + } + + private void scheduleClockUpdating() { + ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { + public Thread newThread(Runnable runnable) { + Thread thread = new Thread(runnable, "System Clock"); + thread.setDaemon(true); + return thread; + } + }); + scheduler.scheduleAtFixedRate(new Runnable() { + public void run() { + now.set(System.currentTimeMillis()); + } + }, period, period, TimeUnit.MILLISECONDS); + } + + private long currentTimeMillis() { + return now.get(); + } + + private static class InstanceHolder { + public static final SystemClock INSTANCE = new SystemClock(1); + } + +} diff --git a/beautiful-api/src/main/java/com/beautiful/api/block/DataBlock.java b/beautiful-api/src/main/java/com/beautiful/api/block/DataBlock.java index bb04da5..dbf0c46 100644 --- a/beautiful-api/src/main/java/com/beautiful/api/block/DataBlock.java +++ b/beautiful-api/src/main/java/com/beautiful/api/block/DataBlock.java @@ -1,34 +1,20 @@ package com.beautiful.api.block; import com.beautiful.api.writable.WritableValue; +import com.google.common.collect.Lists; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; import java.util.List; /** - * @Description:抽象 可以 扩展 + * @Description:抽象 可以 扩展 这是行列形式 * @Author: zhuyuping * @CreateDate: 2018/4/10 13:46 **/ public class DataBlock implements Serializable { - private List> blocks; + private List> blocks = Lists.newArrayList(); - public DataBlock() { - this(Collections.>emptyList()); - - } - - public DataBlock(Collection> data) { - blocks = new LinkedList<>(); - for (final Collection col : data) { - add(new ArrayList<>(col)); - } - } public List> getBlocks() { return blocks; @@ -38,27 +24,37 @@ public void setBlocks(List> blocks) { this.blocks = blocks; } - public T get(final int col, final int row) { - return blocks.get(col).get(row); + public T get(final int row, final int col) { + return blocks.get(row).get(col); } - public void set(final T value, final int col, final int row) { - blocks.get(col).set(row, value); + public void set(final T value, final int row, final int col) { + blocks.get(row).set(col, value); } - public void add(final List col) { - final int len = length(); - for (int r = col.size(); r < len; r++) { - col.add(null); + //public void addHorizontal() + + public void addVertical(List values) { + for (List block : blocks) { + } - blocks.add(col); } - public int size() { + /** + * 行 + * + * @return + */ + public int rows() { return blocks.size(); } - public int length() { + /** + * 列 + * + * @return + */ + public int cols() { return blocks.isEmpty() ? 0 : blocks.get(0).size(); } diff --git a/beautiful-api/src/main/java/com/beautiful/api/index/Index.java b/beautiful-api/src/main/java/com/beautiful/api/index/Index.java deleted file mode 100644 index 522bc04..0000000 --- a/beautiful-api/src/main/java/com/beautiful/api/index/Index.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.beautiful.api.index; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * @Description: - * @Author: zhuyuping - * @CreateDate: 2018/4/10 13:18 - **/ -public class Index { - - private Map index; - - public Index() { - this(Collections.emptyList()); - } - - public Index(final Collection names) { - this(names, names.size()); - } - - public Index(final Collection names, final int size) { - index = new LinkedHashMap<>(names.size()); - final Iterator it = names.iterator(); - for (int i = 0; i < size; i++) { - final Object name = it.hasNext() ? it.next() : i; - add(name, i); - } - } - - public void add(final Object name, final Integer value) { - if (index.put(name, value) != null) { - throw new IllegalArgumentException("duplicate name '" + name + "' in index"); - } - } - - public void extend(final Integer size) { - for (int i = index.size(); i < size; i++) { - add(i, i); - } - } - - public void set(final Object name, final Integer value) { - index.put(name, value); - } - - public Integer get(final Object name) { - final Integer i = index.get(name); - if (i == null) { - throw new IllegalArgumentException("name '" + name + "' not in index"); - } - return i; - } - - public void rename(final Map names) { - final Map idx = new LinkedHashMap<>(); - for (final Map.Entry entry : index.entrySet()) { - final Object col = entry.getKey(); - if (names.keySet().contains(col)) { - idx.put(names.get(col), entry.getValue()); - } else { - idx.put(col, entry.getValue()); - } - } - - // clear and add all names back to preserve insertion order - index.clear(); - index.putAll(idx); - } - - public Set names() { - return index.keySet(); - } - - public Integer[] indices(final Object[] names) { - return indices(Arrays.asList(names)); - } - - public Integer[] indices(final List names) { - final int size = names.size(); - final Integer[] indices = new Integer[size]; - for (int i = 0; i < size; i++) { - indices[i] = get(names.get(i)); - } - return indices; - } -} diff --git a/beautiful-api/src/main/scala/com/beautiful/api/ops/AggregateReducer.scala b/beautiful-api/src/main/scala/com/beautiful/api/ops/Aggregater.scala similarity index 78% rename from beautiful-api/src/main/scala/com/beautiful/api/ops/AggregateReducer.scala rename to beautiful-api/src/main/scala/com/beautiful/api/ops/Aggregater.scala index acfd323..126f26d 100644 --- a/beautiful-api/src/main/scala/com/beautiful/api/ops/AggregateReducer.scala +++ b/beautiful-api/src/main/scala/com/beautiful/api/ops/Aggregater.scala @@ -7,7 +7,7 @@ package com.beautiful.api.ops * @CreateDate: 2018/3/16 下午3:36 * **/ -trait AggregateReducer extends Ops { +trait Aggregater extends Ops { diff --git a/beautiful-api/src/main/scala/com/beautiful/api/ops/Loader.scala b/beautiful-api/src/main/scala/com/beautiful/api/ops/Loader.scala index dd8fe2e..b45d823 100644 --- a/beautiful-api/src/main/scala/com/beautiful/api/ops/Loader.scala +++ b/beautiful-api/src/main/scala/com/beautiful/api/ops/Loader.scala @@ -2,6 +2,7 @@ package com.beautiful.api.ops import com.beautiful.api.row.DataRow +import com.beautiful.api.schema.Schema import com.beautiful.api.split.LoadSplit @@ -16,9 +17,11 @@ import com.beautiful.api.split.LoadSplit **/ trait Loader extends Ops { + val conf: Map[String, String] + val split: LoadSplit - def init(conf: Map[String, String], split: LoadSplit): Unit + def init: Schema def next: DataRow diff --git a/beautiful-data/beautiful-data-vec/pom.xml b/beautiful-data/beautiful-data-vec/pom.xml index bc54c73..7147c68 100644 --- a/beautiful-data/beautiful-data-vec/pom.xml +++ b/beautiful-data/beautiful-data-vec/pom.xml @@ -33,6 +33,11 @@ blueprints-graph-jung 2.6.0 + + com.xeiam.xchart + xchart + 2.5.1 + diff --git a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java index 080b171..95e8851 100644 --- a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java +++ b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java @@ -31,11 +31,4 @@ public class DataFramesFacade { */ - - - - - - - } diff --git a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/package.scala b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/package.scala deleted file mode 100644 index e918efa..0000000 --- a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/package.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com - -/** - * - * @Description: - * @Author: zhuyuping - * @CreateDate: 2018/4/3 23:30 - * - **/ -package object beautiful { - - -} diff --git a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala deleted file mode 100644 index 90655ca..0000000 --- a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/DataFrame.scala +++ /dev/null @@ -1,105 +0,0 @@ -package com.beautiful.data.vec - - -import com.beautiful.api.block.DataBlock -import com.beautiful.api.column.DataColumn -import com.beautiful.api.index.Index -import com.beautiful.api.ops._ -import com.beautiful.api.row.DataRow -import com.beautiful.api.writable.WritableValue -import com.beautiful.api.writable.Writables.WritableValueLike -import shapeless.T - - -/** - * - * @Description: - * @Author: zhuyuping - * @CreateDate: 2018/4/9 13:21 - * - **/ -trait DataFrame { - - def toList: Seq[Seq[WritableValue]] - - def add(column: DataColumn, values: Seq[WritableValue]) - - def add(rows: Seq[DataRow]): DataFrame - - def drop: DataFrame - - def rename - - def reshape(rows: Int, cols: Int) - - def transpose: DataFrame - - def retain: DataFrame - - def reindex: DataFrame - - def merge: DataFrame - - def join: DataFrame - - def update: DataFrame - - def size: Int = getColumns.length - - def isEmpty: Boolean = length == 0 - - def length: Int = toList.length - - def fillna[T: WritableValueLike](v: T) - - def dropna: DataFrame - - def downsample: DataFrame - - def oversample: DataFrame - - def conversion: DataFrame - - def semiSupervised: DataFrame - - def getIndex: Index - - def getColumns: Array[DataColumn] - - def getColumn(name: String): DataColumn - - def getColumn(index: Int): DataColumn - - def groupBy(grouper: Grouper*): DataFrame - - def reducer(reducer: AggregateReducer*): DataFrame - - def sort(sort: Ranker): DataFrame - - def map(transform: Transform): DataFrame - - def filter(filter: Filter): DataFrame - - def from(loader: Loader): DataFrame - - def to(export: Exporter): DataFrame - - def get(row: Int, col: Int): WritableValue - - def slice(rowStart: Int, rowEnd: Int) - - def vizPlot(xColumn: Int, yColumn: Int): Unit - - def vizCount(xColumn: Int, yColumn: Int): Unit - - def print(): Unit - - -} - -abstract class BasicDataFrame(var index: Index, var columns: Seq[DataColumn], var datas: DataBlock[T]) extends DataFrame { - - -} - - diff --git a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/PreProcessBuilder.scala b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/PreProcessBuilder.scala index c6e94c9..b456097 100644 --- a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/PreProcessBuilder.scala +++ b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/PreProcessBuilder.scala @@ -20,7 +20,7 @@ trait PreProcessBuilder { def addRanker(ops: Ranker): this.type - def addReducer(ops: AggregateReducer): this.type + def addReducer(ops: Aggregater): this.type def addOps(ops: Ops): this.type @@ -55,7 +55,7 @@ object SequentialPreProcessBuilder extends PreProcessBuilder { this } - override def addReducer(reducer: AggregateReducer): SequentialPreProcessBuilder.this.type = { + override def addReducer(reducer: Aggregater): SequentialPreProcessBuilder.this.type = { opsGraph += reducer this } @@ -95,7 +95,7 @@ object ComputerGraphPreProcessBuilder extends PreProcessBuilder { this } - override def addReducer(reducer: AggregateReducer): ComputerGraphPreProcessBuilder.this.type = { + override def addReducer(reducer: Aggregater): ComputerGraphPreProcessBuilder.this.type = { opsGraph.addVertex(reducer) this From 26838b3e2f5e2e39bf706e650d4e2143100e3c83 Mon Sep 17 00:00:00 2001 From: zhuyuping Date: Wed, 2 May 2018 23:19:57 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E6=B7=BB=E5=8A=A0ui=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=20jsplumb=20=E6=9D=A5=E5=AE=9E=E7=8E=B0graph?= =?UTF-8?q?=20=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/loader/reader/BasicReader.scala | 44 - .../data/vec/examples/RangeMinMaxFilter.scala | 59 - ...ramesFacade.java => PreProcessFacade.java} | 28 +- .../vec/transform/BaseColumnTransform.scala | 10 +- .../vec/basic/vec/dataframe/DataFrames.scala | 54 + beautiful-ui/pom.xml | 239 +- .../ui/controller/FlowDesignerController.java | 28 + .../src/main/resources/beetl.properties | 83 + .../src/main/resources/config.properties | 23 + .../src/main/resources/log4j.properties | 13 + .../src/main/resources/spring-mongo.xml | 65 + .../src/main/resources/spring-mvc.xml | 125 + beautiful-ui/src/main/resources/spring.xml | 26 + .../WEB-INF/view/flowdesigner/create.html | 384 + beautiful-ui/src/main/webapp/WEB-INF/web.xml | 49 +- beautiful-ui/src/main/webapp/index.jsp | 5 - .../src/main/webapp/statics/css/flowchart.css | 179 + .../src/main/webapp/statics/css/jsplumb.css | 501 + .../main/webapp/statics/css/sb-admin-2.css | 529 + .../webapp/statics/css/sb-admin-2.min.css | 5 + .../src/main/webapp/statics/images/close.png | Bin 0 -> 514 bytes .../src/main/webapp/statics/images/grid.png | Bin 0 -> 115 bytes .../src/main/webapp/statics/js/close.png | Bin 0 -> 514 bytes .../src/main/webapp/statics/js/flowchart.js | 331 + .../main/webapp/statics/js/jquery-ui.min.js | 13 + .../src/main/webapp/statics/js/sb-admin-2.js | 47 + .../main/webapp/statics/js/sb-admin-2.min.js | 6 + .../bootstrap-social/bootstrap-social.css | 660 + .../bootstrap-social/bootstrap-social.less | 172 + .../bootstrap-social/bootstrap-social.scss | 172 + .../vendor/bootstrap/css/bootstrap.css | 8198 +++++++++ .../vendor/bootstrap/css/bootstrap.min.css | 6 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 543 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../statics/vendor/bootstrap/js/bootstrap.js | 2395 +++ .../vendor/bootstrap/js/bootstrap.min.js | 7 + .../dataTables.bootstrap.css | 323 + .../dataTables.bootstrap.js | 186 + .../dataTables.bootstrap.min.js | 8 + .../vendor/datatables-plugins/index.html | 447 + .../dataTables.responsive.css | 122 + .../dataTables.responsive.js | 867 + .../dataTables.responsive.scss | 146 + .../datatables/css/dataTables.bootstrap.css | 211 + .../css/dataTables.bootstrap.min.css | 1 + .../datatables/css/dataTables.bootstrap4.css | 219 + .../css/dataTables.bootstrap4.min.css | 1 + .../datatables/css/dataTables.foundation.css | 135 + .../css/dataTables.foundation.min.css | 1 + .../datatables/css/dataTables.jqueryui.css | 571 + .../css/dataTables.jqueryui.min.css | 1 + .../datatables/css/dataTables.material.css | 100 + .../css/dataTables.material.min.css | 1 + .../datatables/css/dataTables.semanticui.css | 122 + .../css/dataTables.semanticui.min.css | 1 + .../datatables/css/dataTables.uikit.css | 167 + .../datatables/css/dataTables.uikit.min.css | 1 + .../datatables/css/jquery.dataTables.css | 538 + .../datatables/css/jquery.dataTables.min.css | 1 + .../css/jquery.dataTables_themeroller.css | 494 + .../datatables/images/Sorting icons.psd | Bin 0 -> 27490 bytes .../vendor/datatables/images/favicon.ico | Bin 0 -> 894 bytes .../vendor/datatables/images/sort_asc.png | Bin 0 -> 160 bytes .../datatables/images/sort_asc_disabled.png | Bin 0 -> 148 bytes .../vendor/datatables/images/sort_both.png | Bin 0 -> 201 bytes .../vendor/datatables/images/sort_desc.png | Bin 0 -> 158 bytes .../datatables/images/sort_desc_disabled.png | Bin 0 -> 146 bytes .../datatables/js/dataTables.bootstrap.js | 183 + .../datatables/js/dataTables.bootstrap.min.js | 8 + .../datatables/js/dataTables.bootstrap4.js | 185 + .../js/dataTables.bootstrap4.min.js | 8 + .../datatables/js/dataTables.foundation.js | 174 + .../js/dataTables.foundation.min.js | 8 + .../datatables/js/dataTables.jqueryui.js | 164 + .../datatables/js/dataTables.jqueryui.min.js | 9 + .../datatables/js/dataTables.material.js | 192 + .../datatables/js/dataTables.material.min.js | 8 + .../datatables/js/dataTables.semanticui.js | 209 + .../js/dataTables.semanticui.min.js | 9 + .../vendor/datatables/js/dataTables.uikit.js | 177 + .../datatables/js/dataTables.uikit.min.js | 8 + .../vendor/datatables/js/jquery.dataTables.js | 14896 ++++++++++++++++ .../datatables/js/jquery.dataTables.min.js | 166 + .../statics/vendor/datatables/js/jquery.js | 5 + .../flot-tooltip/jquery.flot.tooltip.js | 605 + .../flot-tooltip/jquery.flot.tooltip.min.js | 12 + .../jquery.flot.tooltip.source.js | 594 + .../webapp/statics/vendor/flot/excanvas.js | 1433 ++ .../statics/vendor/flot/excanvas.min.js | 1 + .../vendor/flot/jquery.colorhelpers.js | 180 + .../statics/vendor/flot/jquery.flot.canvas.js | 345 + .../vendor/flot/jquery.flot.categories.js | 192 + .../vendor/flot/jquery.flot.crosshair.js | 176 + .../vendor/flot/jquery.flot.errorbars.js | 369 + .../vendor/flot/jquery.flot.fillbetween.js | 226 + .../statics/vendor/flot/jquery.flot.image.js | 241 + .../webapp/statics/vendor/flot/jquery.flot.js | 3320 ++++ .../vendor/flot/jquery.flot.navigate.js | 443 + .../statics/vendor/flot/jquery.flot.pie.js | 821 + .../statics/vendor/flot/jquery.flot.resize.js | 163 + .../vendor/flot/jquery.flot.selection.js | 371 + .../statics/vendor/flot/jquery.flot.stack.js | 188 + .../statics/vendor/flot/jquery.flot.symbol.js | 71 + .../vendor/flot/jquery.flot.threshold.js | 142 + .../statics/vendor/flot/jquery.flot.time.js | 463 + .../main/webapp/statics/vendor/flot/jquery.js | 9502 ++++++++++ .../vendor/font-awesome/HELP-US-OUT.txt | 7 + .../vendor/font-awesome/css/font-awesome.css | 2870 +++ .../font-awesome/css/font-awesome.css.map | 20 + .../font-awesome/css/font-awesome.min.css | 4 + .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 124988 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 76518 bytes .../fonts/fontawesome-webfont.svg | 1320 ++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 152796 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 90412 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 71896 bytes .../vendor/font-awesome/less/animated.less | 34 + .../font-awesome/less/bordered-pulled.less | 43 + .../vendor/font-awesome/less/core.less | 12 + .../vendor/font-awesome/less/extras.less | 2 + .../vendor/font-awesome/less/fixed-width.less | 6 + .../font-awesome/less/font-awesome.less | 17 + .../vendor/font-awesome/less/icons.less | 2634 +++ .../vendor/font-awesome/less/larger.less | 25 + .../vendor/font-awesome/less/list.less | 22 + .../vendor/font-awesome/less/mixins.less | 59 + .../vendor/font-awesome/less/path.less | 15 + .../font-awesome/less/rotated-flipped.less | 33 + .../font-awesome/less/screen-reader.less | 10 + .../vendor/font-awesome/less/spinning.less | 29 + .../vendor/font-awesome/less/stacked.less | 30 + .../vendor/font-awesome/less/variables.less | 744 + .../vendor/font-awesome/scss/_animated.scss | 34 + .../font-awesome/scss/_bordered-pulled.scss | 43 + .../vendor/font-awesome/scss/_core.scss | 12 + .../vendor/font-awesome/scss/_extras.scss | 80 + .../font-awesome/scss/_fixed-width.scss | 6 + .../vendor/font-awesome/scss/_icons.scss | 2634 +++ .../vendor/font-awesome/scss/_larger.scss | 25 + .../vendor/font-awesome/scss/_list.scss | 22 + .../vendor/font-awesome/scss/_mixins.scss | 59 + .../vendor/font-awesome/scss/_path.scss | 15 + .../font-awesome/scss/_rotated-flipped.scss | 33 + .../font-awesome/scss/_screen-reader.scss | 10 + .../vendor/font-awesome/scss/_spinning.scss | 29 + .../vendor/font-awesome/scss/_stacked.scss | 30 + .../vendor/font-awesome/scss/_variables.scss | 744 + .../font-awesome/scss/font-awesome.scss | 17 + .../webapp/statics/vendor/jquery/jquery.js | 10040 +++++++++++ .../statics/vendor/jquery/jquery.min.js | 4 + .../statics/vendor/metisMenu/metisMenu.css | 62 + .../statics/vendor/metisMenu/metisMenu.js | 120 + .../vendor/metisMenu/metisMenu.min.css | 10 + .../statics/vendor/metisMenu/metisMenu.min.js | 9 + .../webapp/statics/vendor/morrisjs/morris.css | 2 + .../webapp/statics/vendor/morrisjs/morris.js | 1922 ++ .../statics/vendor/morrisjs/morris.min.js | 7 + .../webapp/statics/vendor/raphael/raphael.js | 8393 +++++++++ .../statics/vendor/raphael/raphael.min.js | 3 + pom.xml | 50 +- 163 files changed, 88135 insertions(+), 146 deletions(-) delete mode 100644 beautiful-data/beautiful-data-loader/src/main/scala/com/beautiful/data/loader/reader/BasicReader.scala delete mode 100644 beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/examples/RangeMinMaxFilter.scala rename beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/{DataFramesFacade.java => PreProcessFacade.java} (55%) create mode 100644 beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/basic/vec/dataframe/DataFrames.scala create mode 100644 beautiful-ui/src/main/java/com/beautiful/ui/controller/FlowDesignerController.java create mode 100755 beautiful-ui/src/main/resources/beetl.properties create mode 100755 beautiful-ui/src/main/resources/config.properties create mode 100755 beautiful-ui/src/main/resources/log4j.properties create mode 100755 beautiful-ui/src/main/resources/spring-mongo.xml create mode 100755 beautiful-ui/src/main/resources/spring-mvc.xml create mode 100755 beautiful-ui/src/main/resources/spring.xml create mode 100755 beautiful-ui/src/main/webapp/WEB-INF/view/flowdesigner/create.html delete mode 100644 beautiful-ui/src/main/webapp/index.jsp create mode 100755 beautiful-ui/src/main/webapp/statics/css/flowchart.css create mode 100644 beautiful-ui/src/main/webapp/statics/css/jsplumb.css create mode 100644 beautiful-ui/src/main/webapp/statics/css/sb-admin-2.css create mode 100644 beautiful-ui/src/main/webapp/statics/css/sb-admin-2.min.css create mode 100755 beautiful-ui/src/main/webapp/statics/images/close.png create mode 100755 beautiful-ui/src/main/webapp/statics/images/grid.png create mode 100755 beautiful-ui/src/main/webapp/statics/js/close.png create mode 100755 beautiful-ui/src/main/webapp/statics/js/flowchart.js create mode 100644 beautiful-ui/src/main/webapp/statics/js/jquery-ui.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/js/sb-admin-2.js create mode 100644 beautiful-ui/src/main/webapp/statics/js/sb-admin-2.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap-social/bootstrap-social.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap-social/bootstrap-social.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap-social/bootstrap-social.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/css/bootstrap.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/css/bootstrap.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/js/bootstrap.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/bootstrap/js/bootstrap.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-plugins/dataTables.bootstrap.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-plugins/dataTables.bootstrap.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-plugins/dataTables.bootstrap.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-plugins/index.html create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-responsive/dataTables.responsive.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-responsive/dataTables.responsive.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables-responsive/dataTables.responsive.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.bootstrap.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.bootstrap.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.bootstrap4.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.bootstrap4.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.foundation.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.foundation.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.jqueryui.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.jqueryui.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.material.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.material.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.semanticui.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.semanticui.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.uikit.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/dataTables.uikit.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/jquery.dataTables.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/jquery.dataTables.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/css/jquery.dataTables_themeroller.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/Sorting icons.psd create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/favicon.ico create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/sort_asc.png create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/sort_asc_disabled.png create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/sort_both.png create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/sort_desc.png create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/images/sort_desc_disabled.png create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.bootstrap.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.bootstrap.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.bootstrap4.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.bootstrap4.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.foundation.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.foundation.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.jqueryui.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.jqueryui.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.material.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.material.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.semanticui.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.semanticui.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.uikit.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/dataTables.uikit.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/jquery.dataTables.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/jquery.dataTables.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/datatables/js/jquery.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot-tooltip/jquery.flot.tooltip.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot-tooltip/jquery.flot.tooltip.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot-tooltip/jquery.flot.tooltip.source.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/excanvas.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/excanvas.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.colorhelpers.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.canvas.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.categories.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.crosshair.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.errorbars.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.fillbetween.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.image.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.navigate.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.pie.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.resize.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.selection.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.stack.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.symbol.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.threshold.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.flot.time.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/flot/jquery.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/HELP-US-OUT.txt create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/css/font-awesome.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/css/font-awesome.css.map create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/css/font-awesome.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/FontAwesome.otf create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/animated.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/bordered-pulled.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/core.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/extras.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/fixed-width.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/font-awesome.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/icons.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/larger.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/list.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/mixins.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/path.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/rotated-flipped.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/screen-reader.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/spinning.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/stacked.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/less/variables.less create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_animated.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_bordered-pulled.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_core.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_extras.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_fixed-width.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_icons.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_larger.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_list.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_mixins.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_path.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_rotated-flipped.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_screen-reader.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_spinning.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_stacked.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/_variables.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/font-awesome/scss/font-awesome.scss create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/jquery/jquery.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/jquery/jquery.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/metisMenu/metisMenu.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/metisMenu/metisMenu.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/metisMenu/metisMenu.min.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/metisMenu/metisMenu.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/morrisjs/morris.css create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/morrisjs/morris.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/morrisjs/morris.min.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/raphael/raphael.js create mode 100644 beautiful-ui/src/main/webapp/statics/vendor/raphael/raphael.min.js diff --git a/beautiful-data/beautiful-data-loader/src/main/scala/com/beautiful/data/loader/reader/BasicReader.scala b/beautiful-data/beautiful-data-loader/src/main/scala/com/beautiful/data/loader/reader/BasicReader.scala deleted file mode 100644 index 704250c..0000000 --- a/beautiful-data/beautiful-data-loader/src/main/scala/com/beautiful/data/loader/reader/BasicReader.scala +++ /dev/null @@ -1,44 +0,0 @@ -package com.beautiful.data.loader.reader - -import com.beautiful.api.writable.WritableValue -import org.apache.spark.api.java.JavaRDD -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.SparkSession - -import scala.collection.JavaConverters.{mapAsJavaMapConverter, _} - -/** - * - * @Description:提供一个对外接口 用于java 继承扩展 来实现reader 自定义读取 - * @Author: zhuyuping - * @CreateDate: 2018/3/29 14:28 - * todo: 提供 spark dataSource 自定义dataframe的 简易接口 - * - **/ -trait BasicReader { - - def read(conf: Map[String, String])(implicit session: SparkSession): RDD[Seq[WritableValue]] - -} - -trait JavaBasicReader extends BasicReader { - override def read(conf: Map[String, String])(implicit session: SparkSession): RDD[Seq[WritableValue]] = { - JavaRDD.toRDD(javaRead(conf.asJava)(session).map((v1: java.util.List[WritableValue]) => v1.asScala)) - //JavaRDD.fromRDD() - } - - def javaRead(conf: java.util.Map[String, String])(implicit session: SparkSession): JavaRDD[java.util.List[WritableValue]] -} - -object BasicReader { - - def create(basicReader: BasicReader) = { - new { - def read(conf: Map[String, String])(implicit session: SparkSession): RDD[Seq[WritableValue]] = { - basicReader.read(conf)(session) - } - } - } - - -} diff --git a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/examples/RangeMinMaxFilter.scala b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/examples/RangeMinMaxFilter.scala deleted file mode 100644 index 60f8ed1..0000000 --- a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/examples/RangeMinMaxFilter.scala +++ /dev/null @@ -1,59 +0,0 @@ -package com.beautiful.data.vec.examples - - -import com.beautiful.api.ops.Filter -import com.beautiful.api.writable.WritableValue -import com.beautiful.api.writable.WritableValue.{DoubleWritable, FloatWritable, IntegerWritable, LongWritable} -import com.beautiful.data.vec.filter.BaseColumnFilter -import com.google.common.collect.Range - -/** - * - * @Description:添加一个测试类 - * @Author: zhuyuping - * @CreateDate: 2018/3/22 上午12:10 - * - **/ -class RangeMinMaxFilter(params: Map[String, AnyVal]) extends BaseColumnFilter { - - - require(params != null, "params is not allow null") - require(params.contains(Filter.COLUMN_NAME), "columnName is not allow null") - require(params.contains("min"), "min param value is not allow null") - require(params.contains("max"), "max param value is not allow null") - - val includeLower: Boolean = params.getOrElse("includeLower", true).asInstanceOf - val includeUpper: Boolean = params.getOrElse("includeUpper", true).asInstanceOf - var range: Range[Numeric] = _ - - if (includeLower && includeUpper) { - range = Range.closed[Numeric](params.get("min").get.asInstanceOf, params.get("max").get.asInstanceOf) - } else if (!includeLower && includeUpper) { - range = Range.openClosed[Numeric](params.get("min").get.asInstanceOf, params.get("max").get.asInstanceOf) - } else if (!includeUpper && includeLower) { - range = Range.closedOpen[Numeric](params.get("min").get.asInstanceOf, params.get("max").get.asInstanceOf) - } else { - range = Range.open[Numeric](params.get("min").get.asInstanceOf, params.get("max").get.asInstanceOf) - } - - - override def removeByColumn(writableValue: WritableValue): Boolean = { - writableValue match { - case v: IntegerWritable => range.contains(v.value.asInstanceOf[Numeric]) - case v: LongWritable => range.contains(v.value.asInstanceOf[Numeric]) - case v: FloatWritable => range.contains(v.value.asInstanceOf[Numeric]) - case v: DoubleWritable => range.contains(v.value.asInstanceOf[Numeric]) - case v: _ => throw new IllegalArgumentException(s"非法参数${v}") - } - - } - - override protected val columnName: String = params.get(Filter.COLUMN_NAME).get.asInstanceOf -} - -object RangeMinMaxFilter { - - def apply(columnName: String, map: Map[String, AnyVal]): RangeMinMaxFilter = new RangeMinMaxFilter(map + (Filter.COLUMN_NAME -> columnName)) - - -} diff --git a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/PreProcessFacade.java similarity index 55% rename from beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java rename to beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/PreProcessFacade.java index 95e8851..e890689 100644 --- a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/DataFramesFacade.java +++ b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/facade/PreProcessFacade.java @@ -1,11 +1,32 @@ package com.beautiful.data.vec.facade; +import com.beautiful.api.schema.Schema; +import com.tinkerpop.blueprints.impls.tg.TinkerGraph; + /** * @Description:对外门面 * @Author: zhuyuping * @CreateDate: 2018/2/12 下午6:04 **/ -public class DataFramesFacade { +public class PreProcessFacade { + + private Schema shema; + + private TinkerGraph tinkerGraph; + + public interface BuildStep { + Character build(); + } + + public interface LoadStep { + OperationStep load(Schema schema); + + } + + public interface OperationStep { + OperationStep filter(Schema schema); + + } /** @@ -30,5 +51,10 @@ public class DataFramesFacade { * */ + public static class Builder { + + + } + } diff --git a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/transform/BaseColumnTransform.scala b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/transform/BaseColumnTransform.scala index 9d9a7f3..2181961 100644 --- a/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/transform/BaseColumnTransform.scala +++ b/beautiful-data/beautiful-data-vec/src/main/java/com/beautiful/data/vec/transform/BaseColumnTransform.scala @@ -1,7 +1,7 @@ package com.beautiful.data.vec.transform import com.alibaba.fastjson.JSON -import com.beautiful.api.metadata.ColumnMetaData +import com.beautiful.api.column.DataColumn import com.beautiful.api.ops.Transform import com.beautiful.api.schema.Schema import com.beautiful.api.writable.WritableValue @@ -18,7 +18,7 @@ abstract class BaseColumnTransform extends Transform { protected val columnName: String - def transformColumnMeta(oldmeta: ColumnMetaData): ColumnMetaData + def transformColumnMeta(oldmeta: DataColumn): DataColumn def mapColumn(value: WritableValue):WritableValue @@ -30,9 +30,7 @@ abstract class BaseColumnTransform extends Transform { } override def transform(implicit schema: Schema): Schema = { - val oldmetas = schema.columnMetaDatas - //oldmetas.zipWithIndex.map{case (oldmeta,index) => if (index==columnNumber) transformColumnMeta(oldmeta) else oldmeta)} - return Schema.newSchema(oldmetas.map(oldmeta => if (oldmeta eq oldmetas.toSeq(columnNumber)) transformColumnMeta(oldmeta) else oldmeta).toSeq); - + val oldmetas = schema.dataColumns + Schema.newSchema(oldmetas.map(oldmeta => if (oldmeta eq oldmetas(columnNumber)) transformColumnMeta(oldmeta) else oldmeta)) } } diff --git a/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/basic/vec/dataframe/DataFrames.scala b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/basic/vec/dataframe/DataFrames.scala new file mode 100644 index 0000000..b87a726 --- /dev/null +++ b/beautiful-data/beautiful-data-vec/src/main/scala/com/beautiful/data/vec/basic/vec/dataframe/DataFrames.scala @@ -0,0 +1,54 @@ +package com.beautiful.data.vec.basic.vec.dataframe + +import com.beautiful.api.ops._ +import org.apache.spark.sql.DataFrame + +/** + * + * @Description: + * @Author: zhuyuping + * @CreateDate: 2018/4/12 21:38 + * + **/ +class DataFrames { + + +} + +object DataFrames { + + implicit class PreDataFrame(dataframe: DataFrame) { + def preLoader(loader: Loader): this.type = { + + this + } + + def preFilter(filter: Filter): this.type = { + + this + } + + def preTransformer(transformer: Transform): this.type = { + + this + } + + def preRanker(ranker: Ranker): this.type = { + + this + } + + def preGrouper(group: Grouper): this.type = { + + this + } + + def preAggregater(aggregater: Aggregater): this.type = { + + this + } + + + } + +} diff --git a/beautiful-ui/pom.xml b/beautiful-ui/pom.xml index c3f357f..254bde2 100644 --- a/beautiful-ui/pom.xml +++ b/beautiful-ui/pom.xml @@ -11,14 +11,251 @@ beautiful-ui Maven Webapp http://maven.apache.org + + + + + org.slf4j + slf4j-log4j12 + 1.7.25 + + + log4j + log4j + 1.2.17 + + + org.aspectj + aspectjrt + 1.8.7 + + + org.aspectj + aspectjweaver + 1.8.7 + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-context-support + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + test + + + + org.springframework + spring-webmvc + ${spring.version} + + + com.ibeetl + beetl + 2.8.1 + + + + + com.fasterxml.jackson.core + jackson-core + 2.8.10 + + + + com.fasterxml.jackson.core + jackson-databind + 2.8.10 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.8.10 + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.8.10 + + + org.springframework.data + spring-data-mongodb + 1.9.3.RELEASE + + + org.springframework + spring-test + ${spring.version} + test + + + org.hibernate + hibernate-validator + 5.2.4.Final + + + xml-apis + xml-apis + + + + junit junit - 3.8.1 + 4.12 + test + + + org.testng + testng + 6.11 test + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + beautiful-ui + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + maven-source-plugin + 2.1.2 + + true + + + + compile + + jar + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + package + + run + + + + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + odin-web + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + / + 8888 + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ./target/lib/ + false + false + true + + + + + + + target diff --git a/beautiful-ui/src/main/java/com/beautiful/ui/controller/FlowDesignerController.java b/beautiful-ui/src/main/java/com/beautiful/ui/controller/FlowDesignerController.java new file mode 100644 index 0000000..1156c0f --- /dev/null +++ b/beautiful-ui/src/main/java/com/beautiful/ui/controller/FlowDesignerController.java @@ -0,0 +1,28 @@ +package com.beautiful.ui.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @Description: + * @Author: zhuyuping + * @CreateDate: 2018/4/28 18:59 + **/ +@Controller +@RequestMapping("/flowdesigner") +public class FlowDesignerController { + + + @RequestMapping(value = "/create", method = RequestMethod.GET) + public String create(HttpServletRequest request, HttpServletResponse response) { + + + return "flowdesigner/create"; + } + + +} diff --git a/beautiful-ui/src/main/resources/beetl.properties b/beautiful-ui/src/main/resources/beetl.properties new file mode 100755 index 0000000..09a46e9 --- /dev/null +++ b/beautiful-ui/src/main/resources/beetl.properties @@ -0,0 +1,83 @@ +#\u914d\u7f6e\u5f15\u64ce\u5b9e\u73b0\u7c7b +ENGINE=org.beetl.core.engine.FastRuntimeEngine +#\u6307\u5b9a\u4e86\u5360\u4f4d\u7b26\u53f7\uff0c\u9ed8\u8ba4\u662f${ }.\u4e5f\u53ef\u4ee5\u6307\u5b9a\u4e3a\u5176\u4ed6\u5360\u4f4d\u7b26 +DELIMITER_PLACEHOLDER_START=${ +DELIMITER_PLACEHOLDER_END=} +#\u6307\u5b9a\u4e86\u8bed\u53e5\u7684\u5b9a\u754c\u7b26\u53f7\uff0c\u9ed8\u8ba4\u662f<% %>,\u4e5f\u53ef\u4ee5\u6307\u5b9a\u4e3a\u5176\u4ed6\u5b9a\u754c\u7b26\u53f7 +#DELIMITER_STATEMENT_START=@ +#DELIMITER_STATEMENT_END=null +#\u6307\u5b9aIO\u8f93\u51fa\u6a21\u5f0f\uff0c\u9ed8\u8ba4\u662fFALSE,\u5373\u901a\u5e38\u7684\u5b57\u7b26\u8f93\u51fa\uff0c\u518d\u8003\u8651\u9ad8\u6027\u80fd\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6210true +DIRECT_BYTE_OUTPUT=FALSE +#\u6307\u5b9a\u4e86\u652f\u6301HTML\u6807\u7b7e\uff0c\u4e14\u7b26\u53f7\u4e3a#\uff08\u53ea\u80fd\u7528\u4e00\u4e2a\u7b26\u53f7\u6807\u793a\uff09\uff0c\u9ed8\u8ba4\u914d\u7f6e\u4e0b\uff0c\u6a21\u677f\u5f15\u64ce\u8bc6\u522b<#tag > +#\u8fd9\u6837\u7684\u7c7b\u4f3chtml\u6807\u7b7e\uff0c\u5e76\u80fd\u8c03\u7528\u76f8\u5e94\u7684\u6807\u7b7e\u51fd\u6570\u3002 +HTML_TAG_SUPPORT=true +HTML_TAG_FLAG=# +#\u6307\u5b9a\u5141\u8bb8\u672c\u5730Class\u76f4\u63a5\u8c03\u7528 +NATIVE_CALL=TRUE +#\u6307\u5b9a\u6a21\u677f\u5b57\u7b26\u96c6\u662fUTF-8 +TEMPLATE_CHARSET=UTF-8 +#\u6307\u5b9a\u5f02\u5e38\u7684\u89e3\u6790\u7c7b\uff0c\u9ed8\u8ba4\u662fConsoleErrorHandler\uff0c\u4ed6\u5c06\u5728render\u53d1\u751f\u5f02\u5e38\u7684\u65f6\u5019\u5728\u540e\u53f0\u6253\u5370\u51fa\u9519\u8bef\u4fe1\u606f(System.out)\u3002 +ERROR_HANDLER=org.beetl.core.ConsoleErrorHandler +#\u6307\u5b9a\u4e86\u672c\u5730Class\u8c03\u7528\u7684\u5b89\u5168\u7b56\u7565 +NATIVE_SECUARTY_MANAGER=org.beetl.core.DefaultNativeSecurityManager +#\u6307\u5b9a\u4e86\u9ed8\u8ba4\u4f7f\u7528\u7684\u6a21\u677f\u8d44\u6e90\u52a0\u8f7d\u5668 +RESOURCE_LOADER=org.beetl.core.resource.ClasspathResourceLoader +#\u914d\u7f6e\u4e86\u662f\u5426\u8fdb\u884c\u4e25\u683cMVC\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6b64\u5904\u8bbe\u7f6e\u4e3afalse. +MVC_STRICT=FALSE +#\u8d44\u6e90\u914d\u7f6e\uff0cresource\u540e\u7684\u5c5e\u6027\u53ea\u9650\u4e8e\u7279\u5b9aResourceLoader +#classpath \u6839\u8def\u5f84(\u5176\u5b9e\u5c31\u662f\u524d\u7f00\u7684\u914d\u7f6e) +RESOURCE.root=/WEB-INF/view/ +#\u662f\u5426\u68c0\u6d4b\u6587\u4ef6\u53d8\u5316 +RESOURCE.autoCheck=true +#\u81ea\u5b9a\u4e49\u811a\u672c\u65b9\u6cd5\u6587\u4ef6\u7684Root\u76ee\u5f55\u548c\u540e\u7f00 +#RESOURCE.functionRoot = functions +#RESOURCE.functionSuffix = fn +#\u81ea\u5b9a\u4e49\u6807\u7b7e\u6587\u4ef6Root\u76ee\u5f55\u548c\u540e\u7f00 +#RESOURCE.tagRoot = htmltag +#RESOURCE.tagSuffix = tag +#FN.htmlDecoder =com.aurora.core.template.ext.HtmlDecoderFunction +#FN.htmlEncoder =com.aurora.core.template.ext.HtmlEncoderFunction +##### \u6269\u5c55 ############## +## \u5185\u7f6e\u7684\u65b9\u6cd5 +FN.date=org.beetl.ext.fn.DateFunction +#FN.nvl = org.beetl.ext.fn.NVLFunction +#FN.debug = org.beetl.ext.fn.DebugFunction +#FN.exist = org.beetl.ext.fn.CheckExistFunction +#FN.printf = org.beetl.ext.fn.Printf +#FN.decode = org.beetl.ext.fn.DecodeFunction +#FN.assert = org.beetl.ext.fn.AssertFunction +#FN.print = org.beetl.ext.fn.Print +#FN.println = org.beetl.ext.fn.Println +#FN.trunc = org.beetl.ext.fn.TruncFunction +#FN.empty = org.beetl.ext.fn.EmptyFunction +#FN.qmark = org.beetl.ext.fn.QuestionMark +#FN.isEmpty = org.beetl.ext.fn.EmptyExpressionFunction +#FN.parseInt = org.beetl.ext.fn.ParseInt +#FN.parseDouble= org.beetl.ext.fn.ParseDouble +#FN.range = org.beetl.ext.fn.Range +##\u5185\u7f6e\u7684\u529f\u80fd\u5305 +#FNP.strutil = org.beetl.ext.fn.StringUtil +#FNP.array = org.beetl.ext.fn.ArrayUtil +##\u5185\u7f6e\u7684\u683c\u5f0f\u5316\u51fd\u6570 +FT.dateFormat=org.beetl.ext.format.DateFormat +FT.numberFormat=org.beetl.ext.format.NumberFormat +##\u5185\u7f6e\u7684\u9ed8\u8ba4\u683c\u5f0f\u5316\u51fd\u6570 +FTC.java.util.Date=org.beetl.ext.format.DateFormat +FTC.java.sql.Date=org.beetl.ext.format.DateFormat +FTC.java.sql.Time=org.beetl.ext.format.DateFormat +FTC.java.sql.Timestamp=org.beetl.ext.format.DateFormat +#FTC.java.lang.Short = org.beetl.ext.format.NumberFormat +#FTC.java.lang.Long = org.beetl.ext.format.NumberFormat +#FTC.java.lang.Integer = org.beetl.ext.format.NumberFormat +#FTC.java.lang.Float = org.beetl.ext.format.NumberFormat +#FTC.java.lang.Double = org.beetl.ext.format.NumberFormat +#FTC.java.math.BigInteger = org.beetl.ext.format.NumberFormat +#FTC.java.math.BigDecimal = org.beetl.ext.format.NumberFormat +#FTC.java.util.concurrent.atomic.AtomicLong = org.beetl.ext.format.NumberFormat +#FTC.java.util.concurrent.atomic.AtomicInteger = org.beetl.ext.format.NumberFormat +## \u6807\u7b7e\u7c7b +#TAG.include= org.beetl.ext.tag.IncludeTag +#TAG.includeFileTemplate= org.beetl.ext.tag.IncludeTag +#TAG.layout= org.beetl.ext.tag.LayoutTag +#TAG.delete= org.beetl.ext.tag.DeleteTag +#TAG.htmltag= org.beetl.ext.tag.HTMLTagSupportWrapper \ No newline at end of file diff --git a/beautiful-ui/src/main/resources/config.properties b/beautiful-ui/src/main/resources/config.properties new file mode 100755 index 0000000..eec16e7 --- /dev/null +++ b/beautiful-ui/src/main/resources/config.properties @@ -0,0 +1,23 @@ +mongo.host=127.0.0.1 +mongo.port=27017 +mongo.defaultDbName=aurora +mongo.user=alex.zhu +mongo.pwd=123456 +mongo.connectionsPerHost=10 +mongo.threadsAllowedToBlockForConnectionMultiplier=5 +mongo.minConnectionsPerHost=2 +#连接超时时间 +mongo.connectTimeout=10000 +#等待时间 +mongo.maxWaitTime=120000 +#Socket超时时间 +mongo.socketTimeout=0 +mongo.socketKeepAlive=true +mongo.description=aurora +mongo.maxConnectionIdleTime=1500 +mongo.maxConnectionLifeTime=0 +#mongo slave +mongo.heartbeatSocketTimeout=1000 +mongo.heartbeatConnectTimeout=1500 +mongo.minHeartbeatFrequency=5 +mongo.heartbeatFrequency=10 \ No newline at end of file diff --git a/beautiful-ui/src/main/resources/log4j.properties b/beautiful-ui/src/main/resources/log4j.properties new file mode 100755 index 0000000..f578cfe --- /dev/null +++ b/beautiful-ui/src/main/resources/log4j.properties @@ -0,0 +1,13 @@ +log4j.rootLogger=INFO,CONSOLE,file +logBaseDir=/tmp/logs/aurora-admin +log4j.appender.file=org.apache.log4j.DailyRollingFileAppender +log4j.appender.file.File=${logBaseDir}/aurora-admin-out.log +log4j.appender.file.DatePattern='.'yyyy-MM-dd +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.Threshold=DEBUG +log4j.appender.file.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.Target=System.out +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c %x - %m%n + diff --git a/beautiful-ui/src/main/resources/spring-mongo.xml b/beautiful-ui/src/main/resources/spring-mongo.xml new file mode 100755 index 0000000..b32bd79 --- /dev/null +++ b/beautiful-ui/src/main/resources/spring-mongo.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beautiful-ui/src/main/resources/spring-mvc.xml b/beautiful-ui/src/main/resources/spring-mvc.xml new file mode 100755 index 0000000..ca00fb1 --- /dev/null +++ b/beautiful-ui/src/main/resources/spring-mvc.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + application/json;charset=UTF-8 + text/html;charset=UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + json=application/json + xml=application/xml + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beautiful-ui/src/main/resources/spring.xml b/beautiful-ui/src/main/resources/spring.xml new file mode 100755 index 0000000..96b4522 --- /dev/null +++ b/beautiful-ui/src/main/resources/spring.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/beautiful-ui/src/main/webapp/WEB-INF/view/flowdesigner/create.html b/beautiful-ui/src/main/webapp/WEB-INF/view/flowdesigner/create.html new file mode 100755 index 0000000..a31c557 --- /dev/null +++ b/beautiful-ui/src/main/webapp/WEB-INF/view/flowdesigner/create.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + 一站式机器学习平台 + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+

流程创建

+
+ +
+ +
+
+
+
+ 流程面板 +
+
+
+ +
+ +
Start +
+ + + +
End +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/beautiful-ui/src/main/webapp/WEB-INF/web.xml b/beautiful-ui/src/main/webapp/WEB-INF/web.xml index 9f88c1f..1ecf0c4 100644 --- a/beautiful-ui/src/main/webapp/WEB-INF/web.xml +++ b/beautiful-ui/src/main/webapp/WEB-INF/web.xml @@ -1,7 +1,46 @@ - + + + + + default + /statics/* + /images/* + /icons/* + /skin/* + + + contextConfigLocation + + classpath:spring.xml + + + + spring监听器 + org.springframework.web.context.ContextLoaderListener + + + org.springframework.web.util.IntrospectorCleanupListener + + + spring mvc servlet + springMvc + org.springframework.web.servlet.DispatcherServlet + + spring mvc 配置文件 + contextConfigLocation + classpath:spring-mvc.xml + + 1 + + + springMvc + / + + - - Archetype Created Web Application + diff --git a/beautiful-ui/src/main/webapp/index.jsp b/beautiful-ui/src/main/webapp/index.jsp deleted file mode 100644 index c38169b..0000000 --- a/beautiful-ui/src/main/webapp/index.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - -

Hello World!

- - diff --git a/beautiful-ui/src/main/webapp/statics/css/flowchart.css b/beautiful-ui/src/main/webapp/statics/css/flowchart.css new file mode 100755 index 0000000..211518f --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/css/flowchart.css @@ -0,0 +1,179 @@ +.window { + +} + +.window:hover { + cursor: pointer; +} + +.component { + # #border: 1px solid #346789; + border-radius: 0.5em; + opacity: 0.8; + filter: alpha(opacity=80); + color: black; + padding: 0.5em; + font-size: 0.8em; +} + +.component:hover { + border: 1px solid #123456; + background-color: white; + box-shadow: 2px 2px 19px #444; + -o-box-shadow: 2px 2px 19px #444; + -webkit-box-shadow: 2px 2px 19px #444; + -moz-box-shadow: 2px 2px 19px #fff; + opacity: 0.9; + color: black; + filter: alpha(opacity=90); +} + +.menu { + background-color: #EFEFEF; + border: 1px solid #346789; + box-shadow: 2px 2px 5px #AAAAAA; + color: black; + min-height: 3em; + position: absolute; + min-width: 5em; +} + +.task { + border: 1px solid #346789; + box-shadow: 2px 2px 19px #aaa; + -o-box-shadow: 2px 2px 19px #aaa; + -webkit-box-shadow: 2px 2px 19px #aaa; + -moz-box-shadow: 2px 2px 19px #aaa; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + opacity: 0.8; + filter: alpha(opacity=80); + width: 108px; + height: 40px; + line-height: 1.5em; + text-align: center; + position: absolute; + background-color: #eeeeef; + color: black; + font-family: helvetica; + padding: 5px; + font-size: 0.9em; +} + +.point { + background-color: #333333; + border: 1px solid #346789; + border-radius: 8%; + box-shadow: 2px 2px 5px #AAAAAA; + color: white; + min-width: 48px; + min-height: 30px; + font-size: 11pt; + padding: 5px; + position: absolute; + text-align: center; +} + +.point:hover { + box-shadow: 2px 2px 19px #AAAAAA; +} + +.button { + text-align: center; + border: 1px solid; + margin-top: 5px; + margin-bottom: 5px; +} + +.button:hover { + cursor: pointer; +} + +.menu_button { + padding: 5px; +} + +.menu_button:hover { + background-color: #AAAAAA; + color: black; +} + +.button_add { + background-color: #00CC00; + float: left; + border-radius: 50%; + box-shadow: 0px 3px 8px #aaa, inset 0px 2px 3px #fff; + padding: 2px; + height: 25px; + width: 25px; + color: grey; +} + +.button_add:hover { + background-color: #00AA00; + color: black; +} + +.button_remove { + font-size: 9pt; + color: darkgrey; + border-radius: 30%; + box-shadow: 0px 3px 8px #aaa, inset 0px 2px 3px #fff; + padding: 5px; + min-width: 8px; + max-width: 12px; + text-align: center; +} + +.task .button_remove { + float: right; +} + +.decision .button_remove { + margin: auto auto; +} + +.button_remove:hover { + background-color: darkred; + color: white; +} + +.menu_button_container { + margin: 1px; +} + +.ctrl_container { + margin: 2px; + height: 10px; +} + +.details_container { + margin: 2px; + min-height: 20px; +} + +.detail_label { + font-size: 9pt; + color: grey; +} + +.detail_text { + text-align: center; + display: block; + width: 108px; + font-size: 10pt; +} + +._jsPlumb_connector, ._jsPlumb_startpoint, ._jsPlumb_endpoint, .endpointTargetLabel, .endpointSourceLabel { + cursor: pointer; +} + +#drawingArea { + padding: 21px; + width: 80%; + height: 199px; + border: 1px solid gray; + background-image: url(../images/grid.png); + background-repeat: repeat; +} + diff --git a/beautiful-ui/src/main/webapp/statics/css/jsplumb.css b/beautiful-ui/src/main/webapp/statics/css/jsplumb.css new file mode 100644 index 0000000..fbd0dec --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/css/jsplumb.css @@ -0,0 +1,501 @@ +/** DISABLE TEXT SELECTION (SET ON BODY WHEN DRAGGING IS OCCURRING) **/ +._jsPlumb_drag_select * { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/** OPEN SANS FONT **/ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), + local('OpenSans'), + url("OpenSans-Regular.ttf") format('truetype'), + url("OpenSans.woff") format('woff'); +} + +/** FB **/ +#like { + position: fixed; + width: 77px; + height: 70px; + border: 0; + right: 11px; + bottom: -40px; +} + +#retweet_button { + position: fixed; + bottom: 30px; + right: -7px; +} + +body { + padding: 0; + margin: 0; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + background-color: whitesmoke; +} + +#headerWrapper { + width: 100%; + background-color: white; + position: fixed; + top: 0; + left: 0; + z-index: 100001; + height: 44px; + padding: 0; + opacity: 0.8; + text-align: center; + border-bottom: 1px solid #e5e5e5; + box-shadow: 0px 1px #eee; +} + +#header { + margin-top: 0; + + height: 44px; + font-size: 13px; + margin-left: auto; + margin-right: auto; + + line-height: 44px; + max-width: 1000px; + width: 80%; +} + +@media screen and (max-width: 1000px) { + #header { + width: 100%; + } +} + +@media screen and (max-width: 800px) { + #header select { + display: none; + } +} + +@media screen and (max-width: 700px) { + .library-links { + right: 330px; + } +} + +@media screen and (max-width: 640px) { + .logo { + display: none; + } + + #header { + text-align: center; + overflow: hidden; + } +} + +.explanation i { + float: right; + margin-right: 25px; + margin-top: 13px; + font-size: 25px; + cursor: pointer; +} + +.explanation i:hover { + color: orange; +} + +.words { + text-align: left; + padding: 50px; + background-color: white; +} + +.code { + border: 1px solid #456; +} + +.logo { + font-size: 30px; + color: #1f1f1f; + text-shadow: 1px 1px #ccc; + float: left; + width: 154px; + height: 44px; + background-position: 0px 5px; +} + +#main { + margin-top: 106px; + font-size: 80%; + width: 80%; + margin-left: auto; + margin-right: auto; + height: 600px; + text-align: center; + position: relative; + max-width: 1200px; + max-height: 1000px; +} + +.demo { + position: relative; + width: 100%; + background-color: white; + overflow: auto; + margin-top: 53px; + margin-bottom: 25px; + height: 600px; +} + +.explanation { + position: absolute; + text-align: center; + background-color: #7AB02C; + opacity: 0.8; + filter: alpha(opacity=80); + color: white; + width: 100%; + height: 54px; + z-index: 10000; + overflow: hidden; + box-shadow: 0px 0px 10px gray; +} + +.explanation.expanded { + height: auto; + min-height: 54px; + + -webkit-transition: max-height 0.8s; + max-height: 100%; +} + +.commands { + margin-bottom: 10px; +} + +.commands:hover { + z-index: 10000; +} + +/* demo elements */ + +a, a:visited { + text-decoration: none; + color: black; + border-radius: 0.2em; + -webkit-transition: color 0.15s ease-in; + -moz-transition: color 0.15s ease-in; + -o-transition: color 0.15s ease-in; + transition: color 0.15s ease-in; +} + +a:hover { + color: #7AB02C; +} + +a:active { + color: #FF2300; +} + +.menu, #render, #explanation { + background-color: #fff; +} + +.menu { + float: right; + font-size: 12px; +} + +.menu a { + margin-right: 19px; +} + +.otherLibraries { + display: inline; +} + +#render a { + margin-right: 10px; +} + +.selected { + color: orange !important; +} + +.window, .label { + text-align: center; + z-index: 24; + cursor: pointer; + box-shadow: 2px 2px 19px #aaa; + -o-box-shadow: 2px 2px 19px #aaa; + -webkit-box-shadow: 2px 2px 19px #aaa; + -moz-box-shadow: 2px 2px 19px #aaa; + +} + +path, ._jsPlumb_endpoint { + cursor: pointer; +} + +.cmd { + color: white; + margin-right: 25px; +} + +.cmd:hover { + color: #FF2300; + text-decoration: underline; +} + +.cmd:active { + color: #FF2300; +} + +.label { + font-size: 13px; + padding: 8px; + padding: 8px; +} + +.component { + border: 1px solid #346789; + border-radius: 0.5em; + opacity: 0.8; + filter: alpha(opacity=80); + background-color: white; + color: black; + padding: 0.5em; + font-size: 0.8em; +} + +.component:hover { + border: 1px solid #123456; + box-shadow: 2px 2px 19px #444; + -o-box-shadow: 2px 2px 19px #444; + -webkit-box-shadow: 2px 2px 19px #444; + -moz-box-shadow: 2px 2px 19px #fff; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.window { + background-color: white; + border: 1px solid #346789; + box-shadow: 2px 2px 19px #e0e0e0; + -o-box-shadow: 2px 2px 19px #e0e0e0; + -webkit-box-shadow: 2px 2px 19px #e0e0e0; + -moz-box-shadow: 2px 2px 19px #e0e0e0; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + width: 5em; + height: 5em; + position: absolute; + color: black; + padding: 0.5em; + width: 80px; + height: 80px; + line-height: 80px; + -webkit-transition: -webkit-box-shadow 0.15s ease-in; + -moz-transition: -moz-box-shadow 0.15s ease-in; + -o-transition: -o-box-shadow 0.15s ease-in; + transition: box-shadow 0.15s ease-in; +} + +.window:hover { + border: 1px solid #123456; + box-shadow: 2px 2px 19px #444; + -o-box-shadow: 2px 2px 19px #444; + -webkit-box-shadow: 2px 2px 19px #444; + -moz-box-shadow: 2px 2px 19px #fff; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.window a { + font-family: helvetica; +} + +.demo-links, .library-links { + position: fixed; + right: 0; + top: 44px; + font-size: 11px; + background-color: white; + opacity: 0.8; + padding-right: 10px; + padding-left: 5px; + text-transform: uppercase; + z-index: 100001; +} + +.demo-links div, .library-links a { + display: inline; + margin-right: 7px; + margin-left: 7px; +} + +.demo-links i, .library-links i { + padding: 4px; +} + +.library-links { + right: 515px; + height: 19px; + line-height: 19px; +} + +.current-library { + color: #7AB02C !important; +} + +/** Z-INDEX **/ + +._jsPlumb_connector { + z-index: 18; +} + +._jsPlumb_endpoint { + z-index: 19; +} + +._jsPlumb_overlay { + z-index: 20; +} + +.aLabel { + background-color: white; + padding: 0.4em; + font: 12px sans-serif; + color: #444; + z-index: 21; + border: 1px dotted gray; + opacity: 0.8; + filter: alpha(opacity=80); + cursor: pointer; +} + +.aLabel._jsPlumb_hover { + background-color: #5C96BC; + color: white; + border: 1px solid white; +} + +/* ---------------------- bootstrap dropdowns ------------------------- */ +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* load test */ + +#iframe { + width: 98%; + height: 1000px; + position: absolute; + top: 8px; + left: 1%; + border: 0; +} + +#render { + height: 20px; +} + +#links { + width: 143px; + font-size: 14px; + padding-left: 0px; + position: fixed; + left: 9px; + top: 52px; + z-index: 20; + background-color: white; +} + +ul { + padding: 0; +} + +li { + list-style-type: none; +} + +.current-tests { + color: orange !important; +} + +#qunit-tests li.pass, #qunit-tests li.fail { + background-color: transparent; +} + +.loadtest #main, #main.test { + max-width: none; + margin-top: 52px; + background-color: white; + + margin-left: 162px; +} + +.loadtest ._jsPlumb_connection { + z-index: 3; +} + +.loadtest .jspLoad { + z-index: 4; + position: absolute; + width: 70px; + height: 70px; + cursor: pointer; +} + +.loadtest #header { + height: 11em; + border: 2px solid #824563; +} + +.loadtest #setup { + float: left; +} + +.loadtest #demo { + margin-top: 10em; + position: relative; +} + +.loadtest #setup, .loadtest #output { + font-size: 12px; +} diff --git a/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.css b/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.css new file mode 100644 index 0000000..c80fdaf --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.css @@ -0,0 +1,529 @@ +/*! + * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +body { + background-color: #f8f8f8; +} + +#wrapper { + width: 100%; +} + +#page-wrapper { + padding: 0 15px; + min-height: 568px; + background-color: white; +} + +@media (min-width: 768px) { + #page-wrapper { + position: inherit; + margin: 0 0 0 250px; + padding: 0 30px; + border-left: 1px solid #e7e7e7; + } +} + +.navbar-top-links { + margin-right: 0; +} + +.navbar-top-links li { + display: inline-block; +} + +.navbar-top-links li:last-child { + margin-right: 15px; +} + +.navbar-top-links li a { + padding: 15px; + min-height: 50px; +} + +.navbar-top-links .dropdown-menu li { + display: block; +} + +.navbar-top-links .dropdown-menu li:last-child { + margin-right: 0; +} + +.navbar-top-links .dropdown-menu li a { + padding: 3px 20px; + min-height: 0; +} + +.navbar-top-links .dropdown-menu li a div { + white-space: normal; +} + +.navbar-top-links .dropdown-messages, +.navbar-top-links .dropdown-tasks, +.navbar-top-links .dropdown-alerts { + width: 310px; + min-width: 0; +} + +.navbar-top-links .dropdown-messages { + margin-left: 5px; +} + +.navbar-top-links .dropdown-tasks { + margin-left: -59px; +} + +.navbar-top-links .dropdown-alerts { + margin-left: -123px; +} + +.navbar-top-links .dropdown-user { + right: 0; + left: auto; +} + +.sidebar .sidebar-nav.navbar-collapse { + padding-left: 0; + padding-right: 0; +} + +.sidebar .sidebar-search { + padding: 15px; +} + +.sidebar ul li { + border-bottom: 1px solid #e7e7e7; +} + +.sidebar ul li a.active { + background-color: #eeeeee; +} + +.sidebar .arrow { + float: right; +} + +.sidebar .fa.arrow:before { + content: "\f104"; +} + +.sidebar .active > a > .fa.arrow:before { + content: "\f107"; +} + +.sidebar .nav-second-level li, +.sidebar .nav-third-level li { + border-bottom: none !important; +} + +.sidebar .nav-second-level li a { + padding-left: 37px; +} + +.sidebar .nav-third-level li a { + padding-left: 52px; +} + +@media (min-width: 768px) { + .sidebar { + z-index: 1; + position: absolute; + width: 250px; + margin-top: 51px; + } + + .navbar-top-links .dropdown-messages, + .navbar-top-links .dropdown-tasks, + .navbar-top-links .dropdown-alerts { + margin-left: auto; + } +} + +.btn-outline { + color: inherit; + background-color: transparent; + transition: all .5s; +} + +.btn-primary.btn-outline { + color: #428bca; +} + +.btn-success.btn-outline { + color: #5cb85c; +} + +.btn-info.btn-outline { + color: #5bc0de; +} + +.btn-warning.btn-outline { + color: #f0ad4e; +} + +.btn-danger.btn-outline { + color: #d9534f; +} + +.btn-primary.btn-outline:hover, +.btn-success.btn-outline:hover, +.btn-info.btn-outline:hover, +.btn-warning.btn-outline:hover, +.btn-danger.btn-outline:hover { + color: white; +} + +.chat { + margin: 0; + padding: 0; + list-style: none; +} + +.chat li { + margin-bottom: 10px; + padding-bottom: 5px; + border-bottom: 1px dotted #999999; +} + +.chat li.left .chat-body { + margin-left: 60px; +} + +.chat li.right .chat-body { + margin-right: 60px; +} + +.chat li .chat-body p { + margin: 0; +} + +.panel .slidedown .glyphicon, +.chat .glyphicon { + margin-right: 5px; +} + +.chat-panel .panel-body { + height: 350px; + overflow-y: scroll; +} + +.login-panel { + margin-top: 25%; +} + +.flot-chart { + display: block; + height: 400px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background: transparent; +} + +table.dataTable thead .sorting_asc:after { + content: "\f0de"; + float: right; + font-family: fontawesome; +} + +table.dataTable thead .sorting_desc:after { + content: "\f0dd"; + float: right; + font-family: fontawesome; +} + +table.dataTable thead .sorting:after { + content: "\f0dc"; + float: right; + font-family: fontawesome; + color: rgba(50, 50, 50, 0.5); +} + +.btn-circle { + width: 30px; + height: 30px; + padding: 6px 0; + border-radius: 15px; + text-align: center; + font-size: 12px; + line-height: 1.428571429; +} + +.btn-circle.btn-lg { + width: 50px; + height: 50px; + padding: 10px 16px; + border-radius: 25px; + font-size: 18px; + line-height: 1.33; +} + +.btn-circle.btn-xl { + width: 70px; + height: 70px; + padding: 10px 16px; + border-radius: 35px; + font-size: 24px; + line-height: 1.33; +} + +.show-grid [class^="col-"] { + padding-top: 10px; + padding-bottom: 10px; + border: 1px solid #ddd; + background-color: #eee !important; +} + +.show-grid { + margin: 15px 0; +} + +.huge { + font-size: 40px; +} + +.panel-green { + border-color: #5cb85c; +} + +.panel-green > .panel-heading { + border-color: #5cb85c; + color: white; + background-color: #5cb85c; +} + +.panel-green > a { + color: #5cb85c; +} + +.panel-green > a:hover { + color: #3d8b3d; +} + +.panel-red { + border-color: #d9534f; +} + +.panel-red > .panel-heading { + border-color: #d9534f; + color: white; + background-color: #d9534f; +} + +.panel-red > a { + color: #d9534f; +} + +.panel-red > a:hover { + color: #b52b27; +} + +.panel-yellow { + border-color: #f0ad4e; +} + +.panel-yellow > .panel-heading { + border-color: #f0ad4e; + color: white; + background-color: #f0ad4e; +} + +.panel-yellow > a { + color: #f0ad4e; +} + +.panel-yellow > a:hover { + color: #df8a13; +} + +.timeline { + position: relative; + padding: 20px 0 20px; + list-style: none; +} + +.timeline:before { + content: " "; + position: absolute; + top: 0; + bottom: 0; + left: 50%; + width: 3px; + margin-left: -1.5px; + background-color: #eeeeee; +} + +.timeline > li { + position: relative; + margin-bottom: 20px; +} + +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} + +.timeline > li:after { + clear: both; +} + +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} + +.timeline > li:after { + clear: both; +} + +.timeline > li > .timeline-panel { + float: left; + position: relative; + width: 46%; + padding: 20px; + border: 1px solid #d4d4d4; + border-radius: 2px; + -webkit-box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.175); +} + +.timeline > li > .timeline-panel:before { + content: " "; + display: inline-block; + position: absolute; + top: 26px; + right: -15px; + border-top: 15px solid transparent; + border-right: 0 solid #ccc; + border-bottom: 15px solid transparent; + border-left: 15px solid #ccc; +} + +.timeline > li > .timeline-panel:after { + content: " "; + display: inline-block; + position: absolute; + top: 27px; + right: -14px; + border-top: 14px solid transparent; + border-right: 0 solid #fff; + border-bottom: 14px solid transparent; + border-left: 14px solid #fff; +} + +.timeline > li > .timeline-badge { + z-index: 100; + position: absolute; + top: 16px; + left: 50%; + width: 50px; + height: 50px; + margin-left: -25px; + border-radius: 50% 50% 50% 50%; + text-align: center; + font-size: 1.4em; + line-height: 50px; + color: #fff; + background-color: #999999; +} + +.timeline > li.timeline-inverted > .timeline-panel { + float: right; +} + +.timeline > li.timeline-inverted > .timeline-panel:before { + right: auto; + left: -15px; + border-right-width: 15px; + border-left-width: 0; +} + +.timeline > li.timeline-inverted > .timeline-panel:after { + right: auto; + left: -14px; + border-right-width: 14px; + border-left-width: 0; +} + +.timeline-badge.primary { + background-color: #2e6da4 !important; +} + +.timeline-badge.success { + background-color: #3f903f !important; +} + +.timeline-badge.warning { + background-color: #f0ad4e !important; +} + +.timeline-badge.danger { + background-color: #d9534f !important; +} + +.timeline-badge.info { + background-color: #5bc0de !important; +} + +.timeline-title { + margin-top: 0; + color: inherit; +} + +.timeline-body > p, +.timeline-body > ul { + margin-bottom: 0; +} + +.timeline-body > p + p { + margin-top: 5px; +} + +@media (max-width: 767px) { + ul.timeline:before { + left: 40px; + } + + ul.timeline > li > .timeline-panel { + width: calc(10%); + width: -moz-calc(10%); + width: -webkit-calc(10%); + } + + ul.timeline > li > .timeline-badge { + top: 16px; + left: 15px; + margin-left: 0; + } + + ul.timeline > li > .timeline-panel { + float: right; + } + + ul.timeline > li > .timeline-panel:before { + right: auto; + left: -15px; + border-right-width: 15px; + border-left-width: 0; + } + + ul.timeline > li > .timeline-panel:after { + right: auto; + left: -14px; + border-right-width: 14px; + border-left-width: 0; + } +} diff --git a/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.min.css b/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.min.css new file mode 100644 index 0000000..a685970 --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/css/sb-admin-2.min.css @@ -0,0 +1,5 @@ +/*! + * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */.chat,.timeline{list-style:none}body{background-color:#f8f8f8}#wrapper{width:100%}#page-wrapper{padding:0 15px;min-height:568px;background-color:#fff}@media (min-width:768px){#page-wrapper{position:inherit;margin:0 0 0 250px;padding:0 30px;border-left:1px solid #e7e7e7}}.navbar-top-links{margin-right:0}.navbar-top-links li{display:inline-block}.flot-chart,.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links li:last-child{margin-right:15px}.navbar-top-links li a{padding:15px;min-height:50px}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.sidebar .sidebar-nav.navbar-collapse{padding-left:0;padding-right:0}.sidebar .sidebar-search{padding:15px}.sidebar ul li{border-bottom:1px solid #e7e7e7}.sidebar ul li a.active{background-color:#eee}.sidebar .arrow{float:right}.sidebar .fa.arrow:before{content:"\f104"}.sidebar .active>a>.fa.arrow:before{content:"\f107"}.sidebar .nav-second-level li,.sidebar .nav-third-level li{border-bottom:none!important}.sidebar .nav-second-level li a{padding-left:37px}.sidebar .nav-third-level li a{padding-left:52px}@media (min-width:768px){.sidebar{z-index:1;position:absolute;width:250px;margin-top:51px}.navbar-top-links .dropdown-alerts,.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks{margin-left:auto}}.btn-outline{color:inherit;background-color:transparent;transition:all .5s}.btn-primary.btn-outline{color:#428bca}.btn-success.btn-outline{color:#5cb85c}.btn-info.btn-outline{color:#5bc0de}.btn-warning.btn-outline{color:#f0ad4e}.btn-danger.btn-outline{color:#d9534f}.btn-danger.btn-outline:hover,.btn-info.btn-outline:hover,.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-warning.btn-outline:hover{color:#fff}.chat{margin:0;padding:0}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #999}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0}.chat .glyphicon,.panel .slidedown .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}.login-panel{margin-top:25%}.flot-chart{height:400px}.flot-chart-content{width:100%;height:100%}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{background:0 0}table.dataTable thead .sorting_asc:after{content:"\f0de";float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,.5)}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.huge{font-size:40px}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{border-color:#5cb85c;color:#fff;background-color:#5cb85c}.panel-green>a{color:#5cb85c}.panel-green>a:hover{color:#3d8b3d}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{border-color:#d9534f;color:#fff;background-color:#d9534f}.panel-red>a{color:#d9534f}.panel-red>a:hover{color:#b52b27}.panel-yellow{border-color:#f0ad4e}.panel-yellow>.panel-heading{border-color:#f0ad4e;color:#fff;background-color:#f0ad4e}.panel-yellow>a{color:#f0ad4e}.panel-yellow>a:hover{color:#df8a13}.timeline{position:relative;padding:20px 0}.timeline:before{content:" ";position:absolute;top:0;bottom:0;left:50%;width:3px;margin-left:-1.5px;background-color:#eee}.timeline>li{position:relative;margin-bottom:20px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{float:left;position:relative;width:46%;padding:20px;border:1px solid #d4d4d4;border-radius:2px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.175);box-shadow:0 1px 6px rgba(0,0,0,.175)}.timeline>li>.timeline-panel:before{content:" ";display:inline-block;position:absolute;top:26px;right:-15px;border-top:15px solid transparent;border-right:0 solid #ccc;border-bottom:15px solid transparent;border-left:15px solid #ccc}.timeline>li>.timeline-panel:after{content:" ";display:inline-block;position:absolute;top:27px;right:-14px;border-top:14px solid transparent;border-right:0 solid #fff;border-bottom:14px solid transparent;border-left:14px solid #fff}.timeline>li>.timeline-badge{z-index:100;position:absolute;top:16px;left:50%;width:50px;height:50px;margin-left:-25px;border-radius:50%;text-align:center;font-size:1.4em;line-height:50px;color:#fff;background-color:#999}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}.timeline>li.timeline-inverted>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}.timeline-badge.primary{background-color:#2e6da4!important}.timeline-badge.success{background-color:#3f903f!important}.timeline-badge.warning{background-color:#f0ad4e!important}.timeline-badge.danger{background-color:#d9534f!important}.timeline-badge.info{background-color:#5bc0de!important}.timeline-title{margin-top:0;color:inherit}.timeline-body>p,.timeline-body>ul{margin-bottom:0}.timeline-body>p+p{margin-top:5px}@media (max-width:767px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(10%);width:-moz-calc(10%);width:-webkit-calc(10%);float:right}ul.timeline>li>.timeline-badge{top:16px;left:15px;margin-left:0}ul.timeline>li>.timeline-panel:before{right:auto;left:-15px;border-right-width:15px;border-left-width:0}ul.timeline>li>.timeline-panel:after{right:auto;left:-14px;border-right-width:14px;border-left-width:0}} \ No newline at end of file diff --git a/beautiful-ui/src/main/webapp/statics/images/close.png b/beautiful-ui/src/main/webapp/statics/images/close.png new file mode 100755 index 0000000000000000000000000000000000000000..f1d268e3da9e0bc8e0dbf82abc39f06b7f573d8d GIT binary patch literal 514 zcmV+d0{#7oP)T?Ky;8z46D+5uBh??trU0hJVjY_s zY!~EtCpvJ0o)7eb`#oKWoRvxk;PwGv3&AN4Rv9g8Zns(s27%8mEtj#-CglK?n8Gk@ z8St*6eG!z~Lz#17nrDiU>pr2v1bj{vNTG0#gy%Td8Q=|vBe7hj?QVC>*@Wjk zBQC>S6%8p5@f{&!maCfOaw&ihaX*yc{|)pV+i}8%u7LQB2!nNBblg?|RW?`Vt1@Id zx+g*7RpLJ>M1n^_#&i@!QLwB5?#A1i$WqOjvjXsYlF$;bG?8T#uKUTd{8vW!zO(E~ z#+5-L`qEOZ50Uco2dRhcemF>BSEHjW#3QP?i;gm~ULtE5{`^ixP>rSaM>zsgQzOmu zzHJdT@D6zF)!K06=PXV03brhOlFEx{f_)$3+*p6kKi9e*=Lk~B-~a#s07*qoM6N<$ Ef_)3>-T(jq literal 0 HcmV?d00001 diff --git a/beautiful-ui/src/main/webapp/statics/images/grid.png b/beautiful-ui/src/main/webapp/statics/images/grid.png new file mode 100755 index 0000000000000000000000000000000000000000..87f07dc3ec6fd758047fffda3f639e67843dfd25 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaoB=)|uKRZ%{Qv*|jVrf{l=j*H z1ywy=978H@T|J{H#K6G8T?Ky;8z46D+5uBh??trU0hJVjY_s zY!~EtCpvJ0o)7eb`#oKWoRvxk;PwGv3&AN4Rv9g8Zns(s27%8mEtj#-CglK?n8Gk@ z8St*6eG!z~Lz#17nrDiU>pr2v1bj{vNTG0#gy%Td8Q=|vBe7hj?QVC>*@Wjk zBQC>S6%8p5@f{&!maCfOaw&ihaX*yc{|)pV+i}8%u7LQB2!nNBblg?|RW?`Vt1@Id zx+g*7RpLJ>M1n^_#&i@!QLwB5?#A1i$WqOjvjXsYlF$;bG?8T#uKUTd{8vW!zO(E~ z#+5-L`qEOZ50Uco2dRhcemF>BSEHjW#3QP?i;gm~ULtE5{`^ixP>rSaM>zsgQzOmu zzHJdT@D6zF)!K06=PXV03brhOlFEx{f_)$3+*p6kKi9e*=Lk~B-~a#s07*qoM6N<$ Ef_)3>-T(jq literal 0 HcmV?d00001 diff --git a/beautiful-ui/src/main/webapp/statics/js/flowchart.js b/beautiful-ui/src/main/webapp/statics/js/flowchart.js new file mode 100755 index 0000000..ba2900d --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/js/flowchart.js @@ -0,0 +1,331 @@ +var numberOfElements = 0; +var htmlBase = 'drawingArea'; +var initpoint = {}; +// var rubberbandDrawingActive = false; + +var connectorPaintStyle = { + lineWidth: 1, + strokeStyle: "#096EBB", + joinstyle: "round", + outlineColor: "#096EBB", + outlineWidth: 1 +}; + +var connectorHoverStyle = { + lineWidth: 2, + strokeStyle: "#5C96BC", + outlineWidth: 2, + outlineColor: "white" +}; + +var endpointHoverStyle = { + fillStyle: "#5C96BC" +}; + +var workflowConnectorStartpoint = { + isSource: true, + isTarget: false, + anchor: "Bottom", + maxConnections: -1, + paintStyle: { + strokeStyle: "#1e8151", + fillStyle: "transparent", + radius: 2, + lineWidth: 2 + }, + + connectorStyle: connectorPaintStyle, + hoverPaintStyle: endpointHoverStyle, + connectorHoverStyle: connectorHoverStyle, + dragOptions: {}, + overlays: [["Label", { + location: [0.5, 1.5], + label: "", + cssClass: "endpointSourceLabel" + }]] +}; + +var workflowConnectorEndpoint = { + isSource: false, + isTarget: true, + maxConnections: -1, + anchor: "Top", + paintStyle: { + fillStyle: 'red' + }, + endpoint: ["Rectangle", { + width: 5, + height: 5 + }] +}; + +jsPlumb.ready(function () { + + jsPlumb.draggable($(".window"), {grid: [10, 10]}); + + jsPlumb.bind("dblclick", function (conn, originalEvent) { + jsPlumb.detach(conn); + }); + // 连接事件 + jsPlumb.bind("jsPlumbConnection", function (conn, originalEvent) { + if (conn.connection.sourceId == conn.connection.targetId) { + jsPlumb.detach(conn); + alert("不能连接自己!"); + return false; + } + $.each(jsPlumb.getEndpoints(conn.source), function (i, el) { + if (conn.connection != el.connections[0] && + (el.connections[0].targetId == conn.targetId || (el.connections[0].sourceId == conn.targetId && el.connections[0].targetId == conn.sourceId))) { + jsPlumb.detach(conn); + alert("不能重复连接!"); + return false; + } + }); + }); + + jsPlumb.importDefaults({ + + DragOptions: {cursor: 'pointer', zIndex: 2000}, + EndpointStyles: [{fillStyle: '#225588'}, {fillStyle: '#558822'}], + Endpoints: [["Dot", {radius: 2}], ["Dot", {radius: 2}]], + Connector: ["Flowchart", {stub: [15, 25], gap: 0, cornerRadius: 5, alwaysRespectStubs: true}], + ConnectionOverlays: [ + ["Arrow", { + location: 1, + id: "arrow", + length: 20, + foldback: 0.4 + }], + ["Label", { + location: 0.1, + id: "label", + cssClass: "aLabel" + }] + ] + }); + + $('#' + htmlBase).on('click', '[data-nodetype="closeimg"]', function () { + var $theNode = $(this).parent(); + jsPlumb.detachAllConnections($theNode); + jsPlumb.removeAllEndpoints($theNode); + $theNode.remove(); + }); + + $('#' + htmlBase).on('dblclick', '[data-nodetype="task"]', function () { + var text = $(this).text(); + $(this).html(""); + $(this).append(''); + $("input[type='text']").mouseleave(function () { + $(this).parent().html("
" + $("input[type='text']").val() + "
"); + }); + }); + + //todo 1.点击flownode 添加节点 + //todo 2.双击弹窗model 设置节点属性 + //todo 3.右键显示设置属性 + $(".flownode").click(function () { + + addTask(); + + }); + + + // $(".button_add_task").click(function () { + // addTask(); + // }); + // + // $(".button_add_decision").click(function () { + // addDecision(); + // }); + // + // $('#saveButton').click(function(){ + // saveFlowchart(); + // }); + // + // $('#loadButton').click(function(){ + // loadFlowchart(); + // }); + loadFlowchart(); +}); + +function addTask(id, posX, posY, condition) { + if (typeof id === "undefined") { + numberOfElements++; + id = "taskcontainer" + numberOfElements; + } + var _posX = 150; + var _posY = 210; + if (posX) { + _posX = posX; + } + if (posY) { + _posY = posY; + } + + $('
').appendTo('#' + htmlBase).html( + '
请双击设置
'); + + var taskSourceConnectorEndpoint = { + endpoint: "Dot", + paintStyle: { + strokeStyle: "#1e8151", + fillStyle: "transparent", + radius: 2, + lineWidth: 2 + }, + isSource: true, + maxConnections: -1, + connector: ["Flowchart", {stub: [15, 25], gap: 0, cornerRadius: 5, alwaysRespectStubs: true}], + connectorStyle: connectorPaintStyle, + hoverPaintStyle: endpointHoverStyle, + connectorHoverStyle: connectorHoverStyle, + dragOptions: {}, + overlays: [ + ["Label", { + location: [0.5, 0.5], + label: "", + cssClass: "endpointSourceLabel" + }] + ] + }; + + var taskTargetConnectorEndpoint = { + isTarget: true, + anchor: [0.5, 0, 0, -1, 0, 0, "task_end endpoint"], + endpoint: "Dot", + paintStyle: {fillStyle: "#1e8151", radius: 2}, + hoverPaintStyle: endpointHoverStyle, + maxConnections: -1, + dropOptions: {hoverClass: "hover", activeClass: "active"}, + overlays: [ + ["Label", {location: [0.5, -6], label: condition, cssClass: "component"}] + ] + }; + + jsPlumb.addEndpoint( + $('#' + id), + taskSourceConnectorEndpoint + ); + + jsPlumb.addEndpoint( + $('#' + id), + taskTargetConnectorEndpoint + ); + + jsPlumb.draggable($('#' + id), {grid: [10, 10]}); + return id; +} + +function saveFlowchart() { + var nodes = [] + $(".node").each(function (idx, elem) { + var $elem = $(elem); + if ($elem.attr('id') !== 'taskcontainer0') { + var endpoints = jsPlumb.getEndpoints($elem.attr('id')); + var nodeId = 0; + if (!isNaN($elem.attr('id'))) { + nodeId = $elem.attr('id'); + } + nodes.push({ + id: nodeId, + tempId: $elem.attr('id'), + nodetype: $elem.attr('data-nodetype'), + nodename: $elem.find('.detail_text').first().html(), + positionX: parseInt($elem.css("left"), 10), + positionY: parseInt($elem.css("top"), 10) + }); + } + }); + var connections = []; + $.each(jsPlumb.getConnections(), function (idx, connection) { + connections.push({ + connectionId: connection.id, + sourceId: connection.sourceId, + targetId: connection.targetId + }); + }); + + var flowChart = {}; + flowChart.nodes = nodes; + flowChart.connections = connections; + flowChart.numberOfElements = numberOfElements; + //TODO 界面需要有流程模版id + flowChart.flowTemplateId = 379; + //TODO 界面需提供租户id + flowChart.tenantId = 1000; + + var flowChartJson = JSON.stringify(flowChart); + + + $('#jsonOutput').val(flowChartJson); +} + +function loadFlowchart() { + var flowChartJson = $('#jsonOutput').val(); + var flowChart = ""; + if (flowChartJson) + var flowChart = JSON.parse(flowChartJson); + + var nodes = flowChart.nodes; + if (nodes) + $.each(nodes, function (index, elem) { + if (elem.nodetype === 'startpoint') { + repositionElement('startpoint', elem.tempId, elem.positionX, elem.positionY); + } else if (elem.nodetype === 'endpoint') { + repositionElement('endpoint', elem.tempId, elem.positionX, elem.positionY); + } else if (elem.nodetype === 'task') { + var id = addTask(elem.tempId, elem.positionX, elem.positionY, elem.condition); + repositionElement('task', id, elem.positionX, elem.positionY, elem.nodename); + } + }); + + initpoint.start = jsPlumb.addEndpoint( + $('.startpoint'), + workflowConnectorStartpoint + ); + + initpoint.end = jsPlumb.addEndpoint( + $('[data-nodetype="endpoint"]'), + workflowConnectorEndpoint + ); + + var connections = flowChart.connections; + if (connections) + $.each(connections, function (index, elem) { + var connection1 = jsPlumb.connect({ + source: elem.sourceId, + target: elem.targetId, + overlays: [ + ["Label", { + location: [0.5, 1.5], + label: "", + cssClass: "endpointSourceLabel" + }] + ], + paintStyle: { + strokeStyle: "#1e8151", + fillStyle: "transparent", + radius: 2, + lineWidth: 2 + }, + anchors: ["Bottom", [0.5, 0, 0, -1]] + + }); + }); + jsPlumb.repaintEverything(); + numberOfElements = flowChart.numberOfElements === undefined ? 0 : flowChart.numberOfElements; +} + +function repositionElement(type, id, posX, posY, nodename) { + if (type !== "task") { + $('#' + type).attr('id', id); + } + if (nodename) { + $('#' + id).find('.detail_text').first().html(nodename); + } else { + $('#' + id).css('left', posX); + $('#' + id).css('top', posY); + } + jsPlumb.repaint(id); +} + diff --git a/beautiful-ui/src/main/webapp/statics/js/jquery-ui.min.js b/beautiful-ui/src/main/webapp/statics/js/jquery-ui.min.js new file mode 100644 index 0000000..25398a1 --- /dev/null +++ b/beautiful-ui/src/main/webapp/statics/js/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,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:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,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:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("
"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n) +}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n; +this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("